android - Bitmap的回收
PHPz
PHPz 2017-04-17 13:50:33
[Android讨论组]

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

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;
            }
        }
PHPz
PHPz

学习是最好的投资!

全部回复(2)
ringa_lee

怎么看着好奇怪啊,好像图片异步加载+三级缓存;
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.

热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习
PHP中文网抖音号
发现有趣的

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号