Android ListView OutOfMemoryError:位图大小超过VM预算

时间:2012-06-20 05:40:12

标签: android listview bitmap out-of-memory

好的,这是一个非常常见的问题,但我的有点不同,我找不到其他主题的解决方案,所以我在这里发布新的。我有一个显示ListView的应用程序。 ListView的每一行,我有一个ImageView使用ListAdapter从SD卡加载一个小位图图标(它很小,所以问题与大小无关)。现在如果我慢慢滚动列表,它工作正常。但是如果我滚动得非常快,当ListView足够长时,它不再显示图标,而logcat中的消息就是这样的:

126 600-byte external allocation too large for this process.

VM不会让我们分配126,600字节

然后应用程序崩溃和logcat显示:

java.lang.OutOfMemoryError: bitmap size exceeds VM budget

我在2个不同的设备上进行了测试,其中只有1个出现此错误,另一个正常工作。 请注意,只有在ListView滚动速度非常快时才会出现此错误。那是因为创建的新线程与垃圾收集的步伐不匹配还是什么? 在这种情况下,有人能给我一些建议吗?

1 个答案:

答案 0 :(得分:0)

使用位图时,与ListView一起使用时,您将获得OutOfMemory。

所以你应该去LasyList,如此处所示。

会照顾你的图片加载。

要使用SDCard,您需要替换ImageLoader Class中的方法,如下所示

private Bitmap getBitmap(String url) 
    {
        // If is from SD Card
        try {
            File file = new File(url);
            if(file.exists())
            {
                return BitmapFactory.decodeFile(url);
            }
        } catch (Exception e) {

        }

        File f=fileCache.getFile(url);

        //from SD cache
        Bitmap b = decodeFile(f);
        if(b!=null)
            return b;

        //from web
        try {
            Bitmap bitmap=null;
            URL imageUrl = new URL(url);
            HttpURLConnection conn = (HttpURLConnection)imageUrl.openConnection();
            conn.setConnectTimeout(30000);
            conn.setReadTimeout(30000);
            conn.setInstanceFollowRedirects(true);
            InputStream is=conn.getInputStream();
            OutputStream os = new FileOutputStream(f);
            Utils.CopyStream(is, os);
            os.close();
            bitmap = decodeFile(f);
            return bitmap;
        } catch (Exception ex){
           ex.printStackTrace();
           return null;
        }
    }