我想编写代码来从互联网上加载图片。
我将图片加载到我的应用中,setImageBitmap(Bitmap)
加载ImageView
。但如果我写
if (bitmap != null && !bitmap.isRecycled())
{
bitmap.recycle();
}
ImageView
将不会显示,否则会显示。你能告诉我为什么吗?
例如:
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();
}
}
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;
}
}
答案 0 :(得分:0)
recycle()
不是您真正需要调用的内容。它只适用于需要优化内容以提高内存效率的情况。只需删除对{{#link-to "admin.websocket" tagName="li"}}
{{#link-to "admin.websocket"}}WebSocket{{/link-to}}
{{/link-to}}
的通话,您就可以了。
查看文档以获取更多详细信息:http://developer.android.com/reference/android/graphics/Bitmap.html#recycle()
这是一个高级调用,通常不需要调用,因为正常的GC进程会在没有更多对此位图的引用时释放此内存
答案 1 :(得分:0)
我完全同意Erik Hellman的解决方案,但正如我在上面看到的代码,您仍然使用非常传统的行为来加载图像。只是为了增加你的知识,我建议使用Picasso 。它将自动处理所有图像加载方案,如:自动图像缓存和处理OutOfMemoryException。使用Picasso非常容易,你会找到工作示例here
答案 2 :(得分:-1)
bitmap.recycle();
将从位图释放内存。在这里当你做bitmap.recycle()时,它会清除位图内存,因为这个图像没有显示。