5

プロジェクトで Volley ライブラリを使用していますが、OutOfMemory Exception に問題があります。私のアプリケーションでは、setImageUrlメソッドを使用して NetworkImageView 経由でサーバーから親指とフルサイズの画像をダウンロードしています。私は BitmapLruCache を使用しています:

public class BitmapLruCache extends LruCache<String, Bitmap> implements ImageLoader.ImageCache {

    public static int getDefaultLruCacheSize() {
        final int maxMemory = (int) (Runtime.getRuntime().maxMemory() / 1024);
        final int cacheSize = maxMemory / 8;

        return cacheSize;
    }

    public BitmapLruCache() {
        this(getDefaultLruCacheSize());
    }

    public BitmapLruCache(int sizeInKiloBytes) {
        super(sizeInKiloBytes);
    }

    @Override
    protected int sizeOf(String key, Bitmap value) {
        return value.getRowBytes() * value.getHeight() / 1024;
    }

    @Override
    public Bitmap getBitmap(String url) {
        return get(url);
    }


    @Override
    public void putBitmap(String url, Bitmap bitmap) {
        put(url, bitmap);
    }
}

OutOfMemoryExceptionHTC Desire (Android 2.2.2) を使用しています。この例外にどのように対処できますか? 私がやっている何かが間違っていますか?

編集

サルのテスト中に発生したこの例外:

java.lang.OutOfMemoryError の com.android.volley.toolbox.ByteArrayPool.getBuf(ByteArrayPool.java:101) の com.android.volley.toolbox.PoolingByteArrayOutputStream.expand(PoolingByteArrayOutputStream.java:76) の com.android.volley. toolbox.PoolingByteArrayOutputStream.write(PoolingByteArrayOutputStream.java:84) com.android.volley.toolbox.BasicNetwork.entityToBytes(BasicNetwork.java:213) で com.android.volley.toolbox.BasicNetwork.performRequest(BasicNetwork.java:104) com.android.volley.NetworkDispatcher.run(NetworkDispatcher.java:105) で

@Sipka - それは私の問題を解決しません

@Muhammad Babar - Volley ライブラリはすべてのネットワーク/ビットマップ/キャッシュ操作を処理するため、Volley によって引き起こされる OutOfMemory 例外を修正するソリューションが必要です。

4

1 に答える 1

-2

このコードを使用して、役立つスレッドでビットマップを作成します

Bitmap bitmap = null;
    HttpResponse response = null;
    InputStream instream = null;
    try {

        File file = new File(Environment.getExternalStorageDirectory()
                .toString(), floderName);
        String s = file.getAbsolutePath();
        f = new File(s);
        if (!f.exists()) {
            HttpClient client = new DefaultHttpClient();
            HttpGet request = new HttpGet(new URL(url[0]).toURI());
            response = client.execute(request);
            if (response.getStatusLine().getStatusCode() != 200) {
                return null;
            }
            // BufferedHttpEntity bufHttpEntity = new BufferedHttpEntity(
            // response.getEntity());
            instream = response.getEntity().getContent();

            OutputStream os = new FileOutputStream(f);
            Globals.CopyStream(instream, os);
            os.close();
            instream.close();
        }
        FileInputStream fs = null;
        try {
            fs = new FileInputStream(f);
        } catch (FileNotFoundException e) {
            // TODO do something intelligent
            e.printStackTrace();
        }

        BitmapFactory.Options o2 = new BitmapFactory.Options();
        o2.inDither = false; // Disable Dithering mode
        o2.inPurgeable = true; // Tell to gc that whether it needs free
                                // memory, the Bitmap can be cleared
        o2.inInputShareable = true; // Which kind of reference will be used
                                    // to recover the Bitmap data after
                                    // being clear, when it will be used in
                                    // the future
        o2.inTempStorage = new byte[32 * 1024];
        o2.inSampleSize = 1;
        bitmap = BitmapFactory.decodeFileDescriptor(fs.getFD(), null, o2);
        bit = bitmap;
        // bit.compress(Bitmap.CompressFormat.JPEG, 90, null);
        newsFeed.setBitmap(bit);

        // Data.globelCoverIcon = bit;

        // OutputStream os = new FileOutputStream(f);
    } catch (Exception ex) {
        ex.printStackTrace();

    }
public class Globals {
private static final int JPEG_EOI_1 = 0xFF;
private static final int JPEG_EOI_2 = 0xD9;

public static void CopyStream(InputStream is, OutputStream os) {
    final int buffer_size = 1024;
    try {
        byte[] bytes = new byte[buffer_size];
        for (;;) {
            int count = is.read(bytes, 0, buffer_size);
            if (count == -1)
                break;
            os.write(bytes, 0, count);
        }

    } catch (Exception ex) {
        Log.e("App", ex.getMessage(), ex);
    }

}

}

于 2013-11-26T11:17:20.580 に答える