回收位图

时间:2015-08-17 15:12:44

标签: android bitmap

我想编写代码来从互联网上加载图片。 我将图片加载到我的应用中,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;
    }
}

3 个答案:

答案 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()时,它会清除位图内存,因为这个图像没有显示。