我从网上下载了一张图片。
private void downloadPost()
{
HttpURLConnection conn = null;
try
{
URL url = new URL(IMAGE_URL);
conn = (HttpURLConnection) url.openConnection();
if (conn.getResponseCode() == HttpStatus.SC_OK)
{
InputStream is = conn.getInputStream();
Bitmap bitmap = BitmapFactory.decodeStream(is);
Message msg = new Message();
msg.obj = bitmap;
msg.what = 1;
handler.sendMessage(msg);
}
}
catch (Exception e)
{
e.printStackTrace();
}
}
传给Handler处理的时候,如果设置了bitmap的回收,则imageview.setImageBitmap(bitmap);没有显示图片,但是注视掉以后就显示了,是我回收的地方不对吗?
public void handleMessage(Message msg)
{
super.handleMessage(msg);
switch (msg.what)
{
case 1:
Bitmap bitmap = (Bitmap) msg.obj;
imageview.setImageBitmap(bitmap);
if (bitmap != null && !bitmap.isRecycled())
{
bitmap.recycle();
}
break;
}
}
怎么看着好奇怪啊,好像图片异步加载+三级缓存;
bitmap回收的时机的确不对;
首先setImageBitmap()这个方法只是对bitmap的引用,并没有重新创建bitmap,recycle()之后,bitmap从内存清空,当然显示不出图片。在handler中如果非要回收,那可以bitmap = null销毁引用,然后等待GC回收(并不知道有没有卵用);
建议在转场的时候进行释放,比如Activity的onDestory()方法里。