2

I created PagerAdapter for my application, but the application started to crash with such an error:

Java.lang.RuntimeException: Canvas: attempt to use the recycled bitmap image android.graphics.Bitmap@5d976e0

How I can to fix this?

public class ImageAdapter extends PagerAdapter {
Context context;
private int[] allImages;
ImageView imageView;
LayoutInflater mLayoutInflater;

public ImageAdapter(Context context, int[]images){
    this.context=context;
    mLayoutInflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
    allImages = images;
}

@Override
public int getCount() {
    return allImages.length;
}

@Override
public boolean isViewFromObject(View view, Object object) {
    return view == ((LinearLayout) object);
}

@Override
public Object instantiateItem(ViewGroup container, int position) {
    View itemView = mLayoutInflater.inflate(R.layout.pager_item, container, false);
    if(imageView != null) {
      ((BitmapDrawable)imageView.getDrawable()).getBitmap().recycle();
    }
    imageView = (ImageView) itemView.findViewById(R.id.imgDisplay);
    imageView.setImageResource(allImages[position]);
    container.addView(itemView);
    return itemView;
}

When I select the previous picture in PagerAdapter, the application crashes with this error :

08-06 14:59:08.543 2704-2704/com.secret.cardfocus E/AndroidRuntime: FATAL EXCEPTION: main
                                                                Process: com.secret.cardfocus, PID: 2704
                                                                java.lang.RuntimeException: Canvas: trying to use a recycled bitmap android.graphics.Bitmap@28ebced
                                                                    at android.graphics.Canvas.throwIfCannotDraw(Canvas.java:1271)
                                                                    at android.view.DisplayListCanvas.throwIfCannotDraw(DisplayListCanvas.java:257)
                                                                    at android.graphics.Canvas.drawBitmap(Canvas.java:1415)
                                                                    at android.graphics.drawable.BitmapDrawable.draw(BitmapDrawable.java:545)
                                                                    at android.widget.ImageView.onDraw(ImageView.java:1286)
                                                                    at android.view.View.draw(View.java:17071)
                                                                    at android.view.View.updateDisplayListIfDirty(View.java:16053)
                                                                    at android.view.View.draw(View.java:16837)
                                                                    at android.view.ViewGroup.drawChild(ViewGroup.java:3764)
                                                                    at android.view.ViewGroup.dispatchDraw(ViewGroup.java:3550)
                                                                    at android.view.View.updateDisplayListIfDirty(View.java:16048)
                                                                    at android.view.View.draw(View.java:16837)
                                                                    at android.view.ViewGroup.drawChild(ViewGroup.java:3764)
                                                                    at android.view.ViewGroup.dispatchDraw(ViewGroup.java:3550)
                                                                    at android.view.View.draw(View.java:17074)
                                                                    at android.support.v4.view.ViewPager.draw(ViewPager.java:2443)
                                                                    at android.view.View.updateDisplayListIfDirty(View.java:16053)
                                                                    at android.view.View.draw(View.java:16837)
                                                                    at android.view.ViewGroup.drawChild(ViewGroup.java:3764)
                                                                    at android.view.ViewGroup.dispatchDraw(ViewGroup.java:3550)
                                                                    at android.view.View.updateDisplayListIfDirty(View.java:16048)
                                                                    at android.view.ViewGroup.recreateChildDisplayList(ViewGroup.java:3748)
                                                                    at android.view.ViewGroup.dispatchGetDisplayList(ViewGroup.java:3728)
                                                                    at android.view.View.updateDisplayListIfDirty(View.java:16016)
                                                                    at android.view.ViewGroup.recreateChildDisplayList(ViewGroup.java:3748)
                                                                    at android.view.ViewGroup.dispatchGetDisplayList(ViewGroup.java:3728)
                                                                    at android.view.View.updateDisplayListIfDirty(View.java:16016)
                                                                    at android.view.ViewGroup.recreateChildDisplayList(ViewGroup.java:3748)
                                                                    at android.view.ViewGroup.dispatchGetDisplayList(ViewGroup.java:3728)
                                                                    at android.view.View.updateDisplayListIfDirty(View.java:16016)
                                                                    at android.view.ViewGroup.recreateChildDisplayList(ViewGroup.java:3748)
                                                                    at android.view.ViewGroup.dispatchGetDisplayList(ViewGroup.java:3728)
                                                                    at android.view.View.updateDisplayListIfDirty(View.java:16016)
                                                                    at android.view.ViewGroup.recreateChildDisplayList(ViewGroup.java:3748)
                                                                    at android.view.ViewGroup.dispatchGetDisplayList(ViewGroup.java:3728)
                                                                    at android.view.View.updateDisplayListIfDirty(View.java:16016)
                                                                    at android.view.ViewGroup.recreateChildDisplayList(ViewGroup.java:3748)
                                                                    at android.view.ViewGroup.dispatchGetDisplayList(ViewGroup.java:3728)
                                                                    at android.view.View.updateDisplayListIfDirty(View.java:16016)
                                                                    at android.view.ThreadedRenderer.updateViewTreeDisplayList(ThreadedRenderer.java:656)
                                                                    at android.view.ThreadedRenderer.updateRootDisplayList(ThreadedRenderer.java:662)
                                                                    at android.view.ThreadedRenderer.draw(ThreadedRenderer.java:770)
                                                                    at android.view.ViewRootImpl.draw(ViewRootImpl.java:2796)
                                                                    at android.view.ViewRootImpl.performDraw(ViewRootImpl.java:2604)
                                                                    at android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:2211)
                                                                    at android.view.ViewRootImpl.doTraversal(ViewRootImpl.java:1246)
                                                                    at android.view.ViewRootImpl$TraversalRunnable.run(ViewRootImpl.java:6301)
                                                                    at android.view.Choreographer$CallbackRecord.run(Choreographer.java:871)
                                                                    at android.view.Choreographer.doCallbacks(Choreographer.java:683)
                                                                    at android.view.Choreographer.doFrame(Choreographer.java:619)
                                                                    at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:857)
                                                                    at android.os.Handler.handleCallback(Handler.java:751)
                                                                    at android.os.Handler.dispatchMessage(Handler.java:95)
                                                                    at android.os.Looper.loop(Looper.java:154)
                                                                    at android.app.ActivityThread.main(ActivityThread.java:6077)
                                                                    at java.lang.reflect.Method.invoke(Native Method)
                                                                    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:866)
                                                                    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:756)
  • You should check the size of your images. Do not use large images if you only need to show them as an icon. Keep the sizes as required. – intellignt_idiot Aug 06 '17 at 12:01
  • One picture weighs no more than 30 kb. –  Aug 06 '17 at 12:30
  • I converted the images into WEBP format. –  Aug 06 '17 at 12:31
  • Okay, can you send your source code to me as zip ? I can then fix the issue – intellignt_idiot Aug 06 '17 at 13:40
  • https://github.com/Bobkovn/AndroidProjects/blob/master/CardFocus/src/main/java/com/secret/cardfocus/slider/ImageAdapter.java - PagerAdapter https://github.com/Bobkovn/AndroidProjects/blob/master/CardFocus/src/main/java/com/secret/cardfocus/FragmentsActivity/TricksActivity.java - activity with PagerAdapter –  Aug 06 '17 at 13:58
  • https://github.com/Bobkovn/AndroidProjects/blob/master/CardFocus/src/main/java/com/secret/cardfocus/ImageTricks.java - class where i get images for PagerAdapter –  Aug 06 '17 at 13:59
  • https://drive.google.com/open?id=0BxVj_WYZzv1OYnZ4bFprcC1jQ3M - project –  Aug 06 '17 at 14:00
  • Okay. Let me check your code. Will let you know in an hour – intellignt_idiot Aug 06 '17 at 14:30
  • At which line and class it crashes >? – intellignt_idiot Aug 06 '17 at 14:39
  • Check this link https://stackoverflow.com/questions/19096868/how-can-make-my-viewpager-load-only-one-page-at-a-time-ie-setoffscreenpagelimit – intellignt_idiot Aug 06 '17 at 14:55
  • I added logs to my post. –  Aug 06 '17 at 15:06
  • Unfortunately , the app does not crash on my phone. Check the above comment of mine with link. It may help you. – intellignt_idiot Aug 06 '17 at 15:09
  • On my phone and on the emulator the app crashes. In app there are two adapters, maybe you did not swipe that? Try to swipe the adapter in the activity, which starts after clicking on the ListView. –  Aug 06 '17 at 15:27

0 Answers0