如果说需要在应用程序里展示一些网页,而不希望打开系统浏览器,这时就可以借助 WebView控件在应用程序里嵌入一个浏览器,从而非常轻松地展示各种网页。
由于程序使用到了网络功能,因此需要添加网络访问权限:
<uses-permission android:name="android.permission.INTERNET" />
在activity_main.xml 中添加 WebView 控件,用于显示网页:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent">
<WebView
android:id="@+id/web_view"
android:layout_width="match_parent"
android:layout_height="match_parent"></WebView>
</LinearLayout>
最后在 MainActivity 中为浏览器设置属性并传入地址:
public class MainActivity extends AppCompatActivity {
private WebView webView;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.web_image);
setContentView(R.layout.activity_main);
webView = (WebView) findViewById(R.id.web_view);
//调用setJavaScriptEnabled()方法让WebView支持JS脚本
webView.getSettings().setJavaScriptEnabled(true);
//跳转网页仍然在当前WebView中显示
webView.setWebViewClient(new WebViewClient());
//调用loadUrl()方法,并传入网址,展示相应内容
webView.loadUrl("https://www.baidu.com");
}
}
程序运行截图
动态加载网络图片
和 WebView 一样,加载网络图片也需要网络访问权限:
<uses-permission android:name="android.permission.INTERNET" />
载入图片的原理:根据图片地址获取图片,并将图片由文件流转换为位图对象。
载入图片的过程必须进行异步处理,否则就很容易出现程序无响应(Application Not Responding)的情况。
创建一个 LoadImagesTask 类,继承自 AsyncTask:
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.os.AsyncTask;
import android.widget.ImageView;
import java.io.IOException;
import java.io.InputStream;
import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.URL;
public class LoadImagesTask extends AsyncTask<String, Void, Bitmap> {
private ImageView imageView;
public LoadImagesTask(ImageView imageView) {
this.imageView = imageView;
}
@Override
protected Bitmap doInBackground(String... params) {
URL imageUrl = null;
Bitmap bitmap = null;
InputStream inputStream = null;
try {
imageUrl = new URL(params[0]);
HttpURLConnection conn = (HttpURLConnection) imageUrl.openConnection();
conn.setDoInput(true);
conn.connect();
inputStream = conn.getInputStream();
bitmap = BitmapFactory.decodeStream(inputStream);
inputStream.close();
} catch (MalformedURLException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
return bitmap;
}
@Override
protected void onPostExecute(Bitmap bitmap) {
imageView.setImageBitmap(bitmap);
}
}
异步处理就是在主线程和子线程进行通信,子线程处理耗时任务,并将结果返回到主线程。AsyncTask 将这个过程进行了包装,这里我就不多解释了。
最后在 MainActivity 中进行测试,代码如下:
public class MainActivity extends AppCompatActivity {
private ImageView imageView;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.web_image);
String http = "http://img4.duitang.com/uploads/item/" +
"201403/27/20140327194516_SaKBX.png";
ImageView imageView = (ImageView) findViewById(R.id.image_view);
//启动异步任务,加载网络图片
new LoadImagesTask(imageView).execute(http);
}
}
程序运行截图
热门评论
AsyncTask处理单个图片还可以,线程问题,多次调用就会报错
楼主好人
多谢,学习了!