今天,我们来讲解使用资源定位符(Url)来下载网络图片.由于下载图片属于繁琐操作,我们将其放入新开辟的子线程中。在下面的代码中,由于使用了Handlder来处理UI线程 ,由于消息机制的原因,可能会造成内存泄漏。为了避免内存泄漏,故在Handler中使 用了WeakReference(弱引用)来释放内存。
public class MainActivity extends AppCompatActivity {
private WeakReference<MainActivity>weakReference ;
private Button button ;
private ImageView imageView ;
static String path ="https://ss1.bdstatic.com/70cFuXSh_Q1YnxGkpoWK1HF6hhy/it/
u=2237129721,1649030900&fm=23&gp=0.jpg" ;
private Handler handler =new myHandler(this );
@Override
protected void onCreate(Bundle savedInstanceState) {
super .onCreate(savedInstanceState);
setContentView(R.layout.activity_main );
button = (Button) findViewById(R.id.button );
imageView = (ImageView) findViewById(R.id.image );
button .setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
//启动一条新线程,防止UI线程处理耗时操作
new Thread(new Runnable() {
@Override
public void run() {
try {
//使用资源定位符,path为指定的图片网址
URL url=new URL(path );
//使用资源定位符打开流的操作
InputStream inputStream=url.openStream();
//将读到的流转换成bitmap,用工厂类来解析流。
Bitmap bitmap= BitmapFactory.decodeStream (inputStream);
//使用handler的obtainMessage的方法来放置对象obj
Message message =handler .obtainMessage(0x123 ,bitmap);
handler .sendMessage(message);
} catch (IOException e) {
e.printStackTrace();
}
}
}).start();
}
});
}
//定义一个Handler处理器,处理接收到的信息,改变ImageView。
//使用软引用,放置内存泄漏
private class myHandler extends Handler {
private final WeakReference<MainActivity> weakReference ;
private myHandler(MainActivity activity) {
weakReference = new WeakReference<MainActivity>(activity);
}
@Override
public void handleMessage(Message msg) {
super .handleMessage(msg);
if (weakReference .get()!=null ){
if (msg.what ==0x123 ){
MainActivity.this .imageView .setImageBitmap((Bitmap) msg.obj );
}
}
}
}
}