长ListActivity的内存不足

时间:2011-11-15 15:56:39

标签: android

我有一个ListActivity的问题,它一次加载一个搜索结果,5个项目,当它达到约45个项目时,它会抛出一个内存不足的异常。

我是异步加载来自Web服务器的图像。如果我评论这个,我可以滚动到列表的底部(aprox 58项)没有问题。我知道我应该调用bitmap.Recycle()来gc我不再使用的位图,但我不知道什么时候应该调用它。

class ImageLoadingTask extends AsyncTask<String, Void, Bitmap> {
        private final WeakReference<ImageView>  imageViewReference;
        String                                  url;

        public ImageLoadingTask(ImageView imageView) {
            imageViewReference = new WeakReference<ImageView>(imageView);
            imageViewReference.get().setImageDrawable(null);
        }

        @Override
        protected void onPostExecute(Bitmap result) {
            if (isCancelled()) {
                result = null;
            }
            if (imageViewReference != null) {
                ImageView imageView = imageViewReference.get();
                if (imageView != null) {                        
                    imageView.setImageBitmap(result);
                    //result.recycle();
                }
            }
        }

        @Override
        protected void onPreExecute() {
            if (imageViewReference != null) {
                ImageView imageView = imageViewReference.get();
                if (imageView != null) {
                    imageView.setImageResource(R.drawable.icon);
                }
            }
        }

        @Override
        protected Bitmap doInBackground(String... params) {
            url = params[0];
            return Application.get(getContext()).loadBitmap(url);
        }
    }

正如您在onPostExecute方法中看到的那样。如果我在图像被分配到图像视图之后立即调用回收,那么它就是一种捆绑使用再循环图像的例子。

有人可以帮忙吗?

提前致谢,对不起我的英语:P

1 个答案:

答案 0 :(得分:0)

我建议延迟加载图片。这意味着首先将它们下载到SD卡,然后根据需要将它们加载到列表中。请查看此stackoverflow post,以获取有关如何执行此操作的广泛讨论。