通过网络连接获取图片信息,并将其设为软件的 ImageView 图片属性
介绍:
与获取 HTML
类似,首先需要建立网络连接并获取数据,只是这次不通过 String
获取保存数据,而是使用 Bitmap
保存。
与获取 HTML 数据类似,联网操作同样需要新建线程,要注意的是在子线程不能操作 UI,需要通过外部函数设置图片或者在函数返回 Bitmap
对象使用。
核心代码:
- 建立网络连接,这里使用
HttpURLConnection
URL url = new URL("https://www.example.com.img")
HttpURLConnection connection = (HttpURLConnection) url.openConnection();
connection.setRequestMethod("GET");
// ......
// 诸如超时时间等的设置
- 处理返回数据
InputStream is = connection.getInputStream();
Bitmap bitmap = BitmapFactory.decodeStream(is);
- 设置控件,注意该操作不能在子线程中进行
imageView.setImageBitmap(bitmap);
完整代码
代码很烂,有很多可以优化的地方
//设置网络图片
public void setUrlImage(final int ImageViewId, final String address) {
//开启一个线程用于联网
new Thread(new Runnable() {
@Override
public void run() {
try {
//把传过来的路径转成URL
URL url = new URL(address);
//获取连接
HttpURLConnection connection = (HttpURLConnection) url.openConnection();
//使用GET方法访问网络
connection.setRequestMethod("GET");
//超时时间为10秒
connection.setConnectTimeout(10000);
//获取返回码
int code = connection.getResponseCode();
if (code == 200) {
InputStream inputStream = connection.getInputStream();
//使用工厂把网络的输入流生产Bitmap
Bitmap bitmap = BitmapFactory.decodeStream(inputStream);
//子线程不能操作UI,通过外部函数设置图片
setImage(ImageViewId, bitmap);
inputStream.close();
} else {
//服务启发生错误,显示提示信息
Toast.makeText(HttpImage.this, "Can't get the image from Internet.", Toast.LENGTH_SHORT).show();
}
} catch (Exception e) {
e.printStackTrace();
}
}
}).start();
}
public void setImage(int ImageViewId, Bitmap bitmap) {
ImageView imageView = findViewById(ImageViewId);
imageView.setImageBitmap(bitmap);
}
一些废话
实际上和处理 HTML
是类似的,只不过不再使用 String
处理服务器返回的数据。