【问题标题】:java.lang.RuntimeException: Canvas: trying to use a recycled bitmap android.graphics.Bitmap@4060cc48java.lang.RuntimeException: Canvas: 试图使用回收的位图 android.graphics.Bitmap@4060cc48
【发布时间】:2014-08-24 05:03:01
【问题描述】:

下面是在 doInBackground() 异步任务中从 MediaStore.Images.Thumbnails.getThumbnail 创建超过 4000 张缩略图的代码。现在我在 Android 2.3.6 中执行。它没有在我得到 RuntimeException 之间创建缩略图。

private void loadImages() {

    try {
        columns = new String[] { MediaStore.Images.Media.DATA,
                MediaStore.Images.Media._ID, MediaStore.Images.Media.SIZE,
                MediaStore.Images.Media.TITLE };
        orderBy = new String(MediaStore.Images.Media._ID);

        fileCursor = getActivity().managedQuery(
                MediaStore.Images.Media.EXTERNAL_CONTENT_URI, columns,
                null, null, orderBy);

        image_column_index = fileCursor
                .getColumnIndex(MediaStore.Images.Media._ID);
        this.imageCount = fileCursor.getCount();

        this.thumbnails = new Bitmap[this.imageCount];
        this.arrPath = new String[this.imageCount];
        GlobalValues.IMAGE_ARR_PATH = new String[this.imageCount];
        GlobalValues.IMAGE_THUMBNAILSSELECTION = new boolean[this.imageCount];
        GlobalValues.IMAGES_SIZE = new String[this.imageCount];

        this.thumbnailsselection = new boolean[this.imageCount];
        if (GlobalValues.IMAGE_SELECTION != null) {
            thumbnailsselection = GlobalValues.IMAGE_SELECTION;
            GlobalValues.IMAGE_THUMBNAILSSELECTION = thumbnailsselection;
        }
        int inSample = 1;
        BitmapFactory.Options   opts=null;

        System.out.println("imageCount:"+imageCount);

        for (int i = 0; i < this.imageCount; i++) {
            fileCursor.moveToPosition(i);
            int id = fileCursor.getInt(image_column_index);
            int dataColumnIndex = fileCursor
                    .getColumnIndex(MediaStore.Images.Media.DATA);

            arrPath[i] = fileCursor.getString(dataColumnIndex);
            GlobalValues.IMAGE_ARR_PATH[i] = fileCursor
                    .getString(dataColumnIndex);
            GlobalValues.IMAGES_SIZE[i] = fileCursor.getString(fileCursor
                    .getColumnIndex(MediaStore.Images.Media.SIZE));

        opts = new BitmapFactory.Options();
        opts.inJustDecodeBounds = true;
        opts.inSampleSize = inSample;

            if (Build.VERSION.SDK_INT > 11) {
                 bMap = MediaStore.Images.Thumbnails.getThumbnail(
                        context.getContentResolver(), id,
                        MediaStore.Images.Thumbnails.MICRO_KIND, opts);
             if(bMap != null && !bMap.isRecycled())
                thumbnails[i]= bMap;    
            } else {
                if (arrPath[i].endsWith(".png")) {
                     bMap = BitmapFactory.decodeFile(arrPath[i],opts);
                    bMap = ThumbnailUtils.extractThumbnail(
                            bMap, 96, 96);
                     if(bMap != null && !bMap.isRecycled() )
                    thumbnails[i]= bMap;    
                } else{
                    System.out.println("index:"+i);

                //Getting Error in below code

                     bMap = MediaStore.Images.Thumbnails
                            .getThumbnail(
                                    context.getContentResolver(),
                                    id,
                                    MediaStore.Images.Thumbnails.MICRO_KIND,
                                    (BitmapFactory.Options) opts);
                     System.gc();
                        Runtime.getRuntime().gc();
                     thumbnails[i]= bMap;
                if (bMap != null && !bMap.isRecycled()) {

                    bMap.recycle();
                    bMap = null; 
                }


                }
            }

        }

    } catch (Exception e) {
        e.printStackTrace();
    } 
    finally {
        fileCursor = null;
    }
}

我遇到了以下异常:

07-03 12:40:37.269: E/AndroidRuntime(3185): java.lang.RuntimeException: Canvas: 试图使用回收的位图 android.graphics.Bitmap@4060cc48 07-03 12:40:37.269: E/AndroidRuntime(3185):在 android.graphics.Canvas.throwIfRecycled(Canvas.java:955) 07-03 12:40:37.269:E/AndroidRuntime(3185):在 android.graphics.Canvas.drawBitmap(Canvas.java:1044) 07-03 12:40:37.269:E/AndroidRuntime(3185):在 android.graphics.drawable.BitmapDrawable.draw(BitmapDrawable.java:325) 07-03 12:40:37.269: E/AndroidRuntime(3185): 在 android.widget.ImageView.onDraw(ImageView.java:872) 07-03 12:40:37.269:E/AndroidRuntime(3185):在 android.view.View.draw(View.java:6880) 07-03 12:40:37.269: E/AndroidRuntime(3185):在 android.view.ViewGroup.drawChild(ViewGroup.java:1646) 07-03 12:40:37.269:E/AndroidRuntime(3185):在 android.view.ViewGroup.dispatchDraw(ViewGroup.java:1373) 07-03 12:40:37.269:E/AndroidRuntime(3185):在 android.view.ViewGroup.drawChild(ViewGroup.java:1644) 07-03 12:40:37.269:E/AndroidRuntime(3185):在 android.view.ViewGroup.dispatchDraw(ViewGroup.java:1373) 07-03 12:40:37.269:E/AndroidRuntime(3185):在 android.widget.AbsListView.dispatchDraw(AbsListView.java:1586) 07-03 12:40:37.269:E/AndroidRuntime(3185):在 android.widget.GridView.dispatchDraw(GridView.java:1948) 07-03 12:40:37.269:E/AndroidRuntime(3185):在 android.view.View.draw(View.java:6986) 07-03 12:40:37.269: E/AndroidRuntime(3185):在 android.widget.AbsListView.draw(AbsListView.java:2967) 07-03 12:40:37.269:E/AndroidRuntime(3185):在 android.view.ViewGroup.drawChild(ViewGroup.java:1646) 07-03 12:40:37.269:E/AndroidRuntime(3185):在 android.view.ViewGroup.dispatchDraw(ViewGroup.java:1373) 07-03 12:40:37.269:E/AndroidRuntime(3185):在 android.view.ViewGroup.drawChild(ViewGroup.java:1644) 07-03 12:40:37.269:E/AndroidRuntime(3185):在 android.view.ViewGroup.dispatchDraw(ViewGroup.java:1373) 07-03 12:40:37.269:E/AndroidRuntime(3185):在 android.view.ViewGroup.drawChild(ViewGroup.java:1644) 07-03 12:40:37.269:E/AndroidRuntime(3185):在 android.view.ViewGroup.dispatchDraw(ViewGroup.java:1373) 07-03 12:40:37.269:E/AndroidRuntime(3185):在 android.view.ViewGroup.drawChild(ViewGroup.java:1644) 07-03 12:40:37.269:E/AndroidRuntime(3185):在 android.view.ViewGroup.dispatchDraw(ViewGroup.java:1373) 07-03 12:40:37.269:E/AndroidRuntime(3185):在 android.view.View.draw(View.java:6883) 07-03 12:40:37.269: E/AndroidRuntime(3185):在 android.support.v4.view.ViewPager.draw(ViewPager.java:1574) 07-03 12:40:37.269:E/AndroidRuntime(3185):在 android.view.ViewGroup.drawChild(ViewGroup.java:1646) 07-03 12:40:37.269:E/AndroidRuntime(3185):在 android.view.ViewGroup.dispatchDraw(ViewGroup.java:1373) 07-03 12:40:37.269:E/AndroidRuntime(3185):在 android.view.View.draw(View.java:6883) 07-03 12:40:37.269: E/AndroidRuntime(3185):在 android.view.ViewGroup.drawChild(ViewGroup.java:1646) 07-03 12:40:37.269:E/AndroidRuntime(3185):在 android.view.ViewGroup.dispatchDraw(ViewGroup.java:1373) 07-03 12:40:37.269:E/AndroidRuntime(3185):在 android.view.ViewGroup.drawChild(ViewGroup.java:1644) 07-03 12:40:37.269:E/AndroidRuntime(3185):在 android.view.ViewGroup.dispatchDraw(ViewGroup.java:1373) 07-03 12:40:37.269:E/AndroidRuntime(3185):在 android.view.ViewGroup.drawChild(ViewGroup.java:1644) 07-03 12:40:37.269:E/AndroidRuntime(3185):在 android.view.ViewGroup.dispatchDraw(ViewGroup.java:1373) 07-03 12:40:37.269:E/AndroidRuntime(3185):在 android.view.ViewGroup.drawChild(ViewGroup.java:1644) 07-03 12:40:37.269:E/AndroidRuntime(3185):在 android.view.ViewGroup.dispatchDraw(ViewGroup.java:1373) 07-03 12:40:37.269:E/AndroidRuntime(3185):在 android.view.View.draw(View.java:6883) 07-03 12:40:37.269: E/AndroidRuntime(3185):在 android.widget.FrameLayout.draw(FrameLayout.java:357) 07-03 12:40:37.269:E/AndroidRuntime(3185):在 com.android.internal.policy.impl.PhoneWindow$DecorView.draw(PhoneWindow.java:1921) 07-03 12:40:37.269: E/AndroidRuntime(3185): 在 android.view.ViewRoot.draw(ViewRoot.java:1528) 07-03 12:40:37.269: E/AndroidRuntime(3185):在 android.view.ViewRoot.performTraversals(ViewRoot.java:1264) 07-03 12:40:37.269:E/AndroidRuntime(3185):在 android.view.ViewRoot.handleMessage(ViewRoot.java:1866) 07-03 12:40:37.269:E/AndroidRuntime(3185):在 android.os.Handler.dispatchMessage(Handler.java:99) 07-03 12:40:37.269:E/AndroidRuntime(3185):在 android.os.Looper.loop(Looper.java:130) 07-03 12:40:37.269: E/AndroidRuntime(3185):在 android.app.ActivityThread.main(ActivityThread.java:3687) 07-03 12:40:37.269:E/AndroidRuntime(3185):在 java.lang.reflect.Method.invokeNative(Native Method) 07-03 12:40:37.269:E/AndroidRuntime(3185):在 java.lang.reflect.Method.invoke(Method.java:507) 07-03 12:40:37.269: E/AndroidRuntime(3185):在 com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:867) 07-03 12:40:37.269: E/AndroidRuntime(3185): 在 com.android.internal.os.ZygoteInit.main(ZygoteInit.java:625) 07-03 12:40:37.269:E/AndroidRuntime(3185):在 dalvik.system.NativeStart.main(Native Method)

【问题讨论】:

    标签: android canvas bitmap thumbnails runtimeexception


    【解决方案1】:

    您将位图存储在数组thumbnails[i]= bMap; 中。我想你以后会用它们来画画吗?

    然后您调用bMap.recycle(); 来释放存储在本机内存中的位图数据。您应该只在您打算不再使用的位图上调用recycle();

    【讨论】:

      猜你喜欢
      • 2012-07-25
      • 1970-01-01
      • 2011-05-15
      • 2014-04-03
      • 2012-12-17
      • 1970-01-01
      • 1970-01-01
      • 2013-06-25
      相关资源
      最近更新 更多