安卓使用ImageView控件获取网络图片是我们在开发应用程序中常常用到的一个功能,我们来分享一下是怎么实现这一功能的。
这个例子是点击Button按钮,就会按照制定url地址找到图片的位置,并下载绑定到对应的ImageView控件上。
整体思路:在xml文件中定义一个Button控件和一个ImageView控件,然后在活动中的Button控件的OnClick事件中开启一个线程,这个线程会调用获取网络图片的方法,在获取网络图片的方法中,使用图片工厂得到图片的路径返回一个位图对象,把这个位图对象作为一个消息的内容来传递,在handler中接收到这个消息的内容并绑定为ImageView的图片,其中获取网络数据的方式为GET方式,以读入流的形式进行。
activity_main.xml文件:
<Button
android:id="@+id/button"
android:layout_height="wrap_content"
android:layout_width="fill_parent"
android:text="获取网络图片"
/>
<ImageView
android:id="@+id/imageview"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
/>
MainActivity.java文件:
private ImageView getImageview;
private Button getButton;
private final String IMAGE_URL="http://img.hen2.com/201509/source_img/150_G_1442562155435.jpg";
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
getButton = (Button) findViewById(R.id.button);
getImageview = (ImageView) findViewById(R.id.imageview);
getButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
new Thread(runa).start();
}
});
}
// 获取网络图片
public void setView(String path) {
String picturepath = path;
byte[] data = null;
try {
data = getImage(picturepath);
Bitmap bitmap = BitmapFactory.decodeByteArray(data, 0, data.length);// BitmapFactory:图片工厂!
Looper.prepare();// 必须调用此方法,要不然会报错
Message msg = new Message();
msg.what = 0;
msg.obj = bitmap;
handler.sendMessage(msg);
} catch (Exception e) {
Toast.makeText(getApplicationContext(), "获取图片错误", 1).show();
}
}
//定义一个handler给imageview绑定图片
private Handler handler = new Handler() {
@Override
public void handleMessage(Message msg) {
if (msg.what == 0) {
getImageview.setImageBitmap((Bitmap) msg.obj);
}
}
};
//定义一个Runnable,调用获取网络图片的方法
private Runnable runa = new Runnable() {
@Override
public void run() {
setView(IMAGE_URL);
}
};
// 获取网络图片的数据
public static byte[] getImage(String picturepath) throws Exception {
URL url = new URL(picturepath);
HttpURLConnection conn = (HttpURLConnection) url.openConnection();// 基于http协议的连接对象
conn.setConnectTimeout(10000);// 10秒(源码有问题,把10(10毫秒)改为了10000(10秒)现在正确了)
conn.setRequestMethod("GET");// 大写
if (conn.getResponseCode() == 200) {
InputStream ins = conn.getInputStream();
return read(ins);
}
return null;
}
//流工具
public static byte[] read(InputStream ins) throws Exception {
ByteArrayOutputStream outstream = new ByteArrayOutputStream();
byte[] buffer = new byte[1024];
int length = 0;
while ((length = ins.read(buffer)) > -1) {
outstream.write(buffer, 0, length);
}
outstream.close();
return outstream.toByteArray();
}