刷新时清除位图以停止内存不足异常

时间:2016-12-04 06:54:45

标签: java android bitmap

快速问题我在页面上加载了多个位图以节省时间我将它们加载到内存中时保存了一段时间但是它应该在它完整后自动删除

但如果我继续重新加载页面最终它会因内存不足而崩溃,我想清除所有的位图,包括我重新加载页面中的那些,因为我不确定我什么时候完成与每个位图 我有5个不断改变图像的imageViews,因此有点难以跟踪它们 有没有办法做到这一点?

    final int maxMemory = (int) (Runtime.getRuntime().maxMemory() / 1024);
    final int cacheSize = maxMemory / 8;

    mMemoryCache = new LruCache<String, Bitmap>(cacheSize) {
        @Override
        protected int sizeOf(String key, Bitmap bitmap) {
            // The cache size will be measured in kilobytes rather than
            // number of items.
            return bitmap.getByteCount() / 1024;
        }
    };

}

public void addBitmapToMemoryCache(String key, Bitmap bitmap) {
    if(getBitmapFromMemCache(key) == null) {
        mMemoryCache.put(key, bitmap);
    }
}

public Bitmap getBitmapFromMemCache(String key) {
    return mMemoryCache.get(key);
}

public void loadBitmap(String resId, ImageView imageView) {
    final String imageKey = String.valueOf(resId);
    iv = imageView.getWidth();
    Bitmap bitmap = getBitmapFromMemCache(imageKey);
    if(bitmap != null) {
        imageView.setImageBitmap(bitmap);
    }else{
        if(cancelPotentialWork(imageKey, imageView)){
            Bitmap loading = decodeSampledBitmapFromResource(ctx.getResources(), R.drawable.whiteseetrough, imageView.getWidth(), imageView.getWidth());
            BitmapWorkerTask task = new BitmapWorkerTask(imageView);
            AsyncDrawable asyncDrawable = new AsyncDrawable(ctx.getResources(), loading, task);
            imageView.setImageDrawable(asyncDrawable);
            task.execute(resId);
        }
    }
}

这是我的代码加载位图并添加到catch我使用

调用它
bitmapHTTP getBitmap = new bitmapHTTP(this);

getBitmap.loadBitmap(picUrl, imageView);

2 个答案:

答案 0 :(得分:0)

在刷新方法中调用LruCache的这种方法

File "client.py", line 132, in sendClickedSquare
    if self.myTurn:
AttributeError: 'TicTacToeClient' object has no attribute 'myTurn'

答案 1 :(得分:0)

首先,你需要在完成使用后调用bitmap.recycle(),只是释放引用是不够的。

请注意,缓存中的设置和使用中的设置并不总是相同(尽管在特定情况下它们可以相同,具体取决于您的使用情况)。如果它们可以分歧,则必须在单独的数据结构中跟踪使用的图像,例如通过维护引用计数和覆盖LRUCache方法以在适当时跟踪和回收。

这不是那么简单,请参阅When should I recycle a bitmap using LRUCache?以获取讨论和代码。