-2

OK、これは非常に一般的な問題ですが、私の問題は少し異なり、他のトピックに関する解決策が見つからないため、ここに新しい問題を投稿します。ListViewを表示するアプリケーションがあります。ListViewの各行には、ListAdapterを使用してSDカードから小さなビットマップアイコンをロードするためのImageViewがあります(小さいので問題はサイズではありません)。リストをゆっくりスクロールすると、正常に機能します。しかし、本当に速くスクロールすると、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つだけでこのエラーが発生し、もう1つは正常に動作します。このエラーは、ListViewが非常に高速にスクロールされた場合にのみ発生することに注意してください。これは、作成された新しいスレッドがガベージコレクションなどのペースと一致していないためですか?この状況で誰かが私にいくつかの提案をすることができますか?

4

1 に答える 1

0

ビットマップを操作しているときに、ListViewを使用すると、ほとんどの場合OutOfMemoryが取得されます。

したがって、ここに示すように、 LasyListを選択する必要があります。

画像の読み込みを処理します。

SDCardを使用するには、以下に示すようにImageLoaderクラスのメソッドを置き換える必要があります

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;
        }
    }
于 2012-06-20T05:49:54.373 に答える