3

携帯電話 (サイズ 720x1280) でアプリをテストしています。サンプル サイズ 2 を使用すると、アプリは正常に動作します。サンプル サイズ 1 を使用しようとすると、画像を描画する行でアプリがクラッシュします (下記のコード)。コードの修正が必要な場所を教えてください。

            canvas.drawBitmap(backgoundImage, 0, 0  , null);  

コード

    public  Bitmap getAssetImage(Context context, String filename) throws IOException {
        AssetManager assets = getApplicationContext().getResources().getAssets();
        InputStream buffer = null;
        try {
            buffer = new BufferedInputStream((assets.open("drawable/" + filename + ".png")));
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }  

        BitmapFactory.Options options = new BitmapFactory.Options(); 
        options.inPurgeable = true;  

        if (tabletSize) {
            Log.i("DragDrop", "am tablet");   
        } else {
            Log.i("DragDrop", "am phone");  
            options.inSampleSize = 1; 
        }


        Bitmap temp = BitmapFactory.decodeStream(buffer, null, options);
        Bitmap finalImage = Bitmap.createScaledBitmap(temp, (int) dWidth, (int) dHeight, true);
        temp.recycle();
        temp=null; 
        return finalImage;   

    }

LogCat

07-07 12:28:14.150: E/AndroidRuntime(7256): FATAL EXCEPTION: Thread-748
07-07 12:28:14.150: E/AndroidRuntime(7256): java.lang.RuntimeException: Canvas: trying to use a recycled bitmap android.graphics.Bitmap@416ec9f0
07-07 12:28:14.150: E/AndroidRuntime(7256): at android.graphics.Canvas.throwIfRecycled(Canvas.java:1026)
07-07 12:28:14.150: E/AndroidRuntime(7256): at android.graphics.Canvas.drawBitmap(Canvas.java:1065)
07-07 12:28:14.150: E/AndroidRuntime(7256): at com.example.funandlearn.DragDrop$MyBringBackSurface.run(DragDrop.java:640)
07-07 12:28:14.150: E/AndroidRuntime(7256): at java.lang.Thread.run(Thread.java:856)

参考までに、Line # 640 にコードがあります

            canvas.drawBitmap(backgoundImage, 0, 0  , null);  
4

1 に答える 1

1

あなたはこれを持っています

    Bitmap temp = BitmapFactory.decodeStream(buffer, null, options);
    Bitmap finalImage = Bitmap.createScaledBitmap(temp, (int) dWidth, (int) dHeight, true);
    temp.recycle();
    temp=null; 

あなたのログキャットは言う

    Canvas: trying to use a recycled bitmap

使用しないときは、ビットマップをリサイクルする必要があります。

ドキュメントからの引用

Android 2.3.3 (API レベル 10) 以前では、recycle() の使用が推奨されます。

recycle()ビットマップが使用されなくなったことが確実な場合にのみ使用してください。recycle() を呼び出した後でビットマップを描画しようとすると、「キャンバス: リサイクルされたビットマップを使用しようとしています」というエラーが発生します。

Android 3.0 以降でメモリを管理する

Android 3.0 (API レベル 11) ではBitmapFactory.Options.inBitmapフィールドが導入されています。このオプションが設定されている場合、Options オブジェクトを受け取るデコード メソッドは、 content をロードするときに既存のビットマップを再利用しようとします。使用する必要はありませんrecycle

こちらもチェック

http://developer.android.com/training/displaying-bitmaps/manage-memory.html

于 2013-07-07T07:33:07.557 に答える