1

我正在为我拥有的很多位图图块实现缓存。到目前为止我所做的:

成功实现了 LRU 缓存系统,但是当必须从应用程序的资源中加载切片时,切片仍然加载缓慢。缓存目前的命中率约为 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 方法中调用的,我认为对它的多次调用导致了它。感谢您的任何建议。

4

2 回答 2

1

参考这个链接

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

于 2012-06-04T17:54:31.890 回答
0

加载后,将其Bitmap保存在类变量中。然后下次请求抽签时,在再次从资源加载之前检查类变量是否为非空。

于 2012-06-04T17:34:20.523 回答