首页 > Bitmap的回收

Bitmap的回收

我从网上下载了一张图片。

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()方法里。


你在哪里都不应该回收啊.回收了之后显示不出来不是正常的?
官网的解释

The bitmap is marked as "dead", meaning it will throw an exception if getPixels() or setPixels() is called, and will draw nothing.

【热门文章】
【热门文章】