Android位图缓存

标签 android caching bitmap android-asynctask

我正在为我拥有的大量位图图 block 实现缓存。到目前为止我做了什么:

成功实现了 LRU 缓存系统,但是当必须从应用程序的资源中加载时,图 block 仍然加载缓慢。缓存目前有大约 85% 的命中率。

每当我必须从资源加载位图时,它仍然像我说的那样慢。考虑到这一点,我现在从异步任务加载位图。在此之前,一切都可以无误地加载,但速度相当慢。现在,它更快了,因为它不在主线程上工作,但我不可避免地遇到了 OOM 错误。这是我的异步任务的代码:

public class loadBitmap extends AsyncTask<Void,Void,Void>
{
    Bitmap bit;
    @Override
    protected Void doInBackground(Void... params) 
    {
        Options opts = new Options();
        bit = BitmapFactory.decodeResource(reso, drawable, opts);
        return null;
    }

    @Override
    protected void onPostExecute(Void result) 
    {
        // TODO Auto-generated method stub
        drawLoadedBit(bit);
        super.onPostExecute(result);
    }
}

关于如何实现此功能以免出现内存不足错误的任何想法?由于这是在 draw 方法中调用的,我认为是对它的多次调用导致了它。感谢您的任何建议。

最佳答案

Refer to this link

他提供了一个关于使用再生位图的很好的教程。此外,要将位图与 View 分离[一旦 View 被处置],您可以@Override View#onRemovedFromWindow() 来回收位图。更进一步,如果您仍然有这个问题,您可以创建一个 BitmapPool,您可以在其中分配位图。您可以实现一个算法来计算位图的大小并释放旧位图,这将使您超过任意内存量(bitamp 内存大约是宽度*高度*4 + 应该是标称的对象大小)

关于Android位图缓存,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10885496/

相关文章:

php - 如何在 WordPress 插件的 SQL 数据库中缓存第三方 API 访问

c# - 在不同 session 之间共享一级缓存?

WPF - 以 jpeg 格式保存 Canvas 的黑色背景

android - 划屏显示android中的图像

android如何下载一个1mb的图像文件并设置为ImageView

android - 使用 sql 数据库项填充 ListView

java - 使用套接字在 Java 中的客户端服务器应用程序上进行 xml 处理

android - 如何使用 FirebaseJobDispatcher

asp.net - javascript 和 asp.net 的缓存问题

android - 如何在Android中逐像素显示位图?