当位图选项inSampleSize = 1时,应用程序崩溃

时间:2013-07-07 07:09:31

标签: android android-canvas android-image

我在手机上测试应用程序(尺寸为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)

供参考#640行代码

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

1 个答案:

答案 0 :(得分:1)

你有这个

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

你的logcat说

    Canvas: trying to use a recycled bitmap

您应该在不使用时回收位图。

从文档引用

在Android 2.3.3(API级别10)及更低版本上,建议使用recycle()。

只有在确定不再使用位图时才应使用recycle()。如果你调用recycle()并稍后尝试绘制位图,你将得到错误:" Canvas:尝试使用循环位图"。

在Android 3.0及更高版本上管理内存

Android 3.0(API Level 11)引入了 BitmapFactory.Options.inBitmap 字段。 如果设置了此选项,那么采用Options对象的解码方法将在加载内容时尝试重用现有位图。无需使用recycle

同时检查此

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