question-mark
Stuck on an issue?

Lightrun Answers was designed to reduce the constant googling that comes with debugging 3rd party libraries. It collects links to all the places you might be looking at while hunting down a tough bug.

And, if you’re still stuck at the end, we’re happy to hop on a call to see how we can help out.

“Cannot draw recycled bitmaps” exception

See original GitHub issue

I’ve music player app which interacts with RemoteControlClient. I need to load album cover image to display it in lock screen remote contol. I’m trying to use Piccasso to achieve this. I’ve written the following code:

private final Target artworkTarget = new Target() {
    @Override
    public void onBitmapLoaded(Bitmap bitmap, Picasso.LoadedFrom loadedFrom) {
        remoteControlClient.editMetadata(false).putBitmap(RemoteControlClientCompat.MetadataEditorCompat.METADATA_KEY_ARTWORK,
                bitmap).apply();
    }

    @Override
    public void onBitmapFailed(Drawable drawable) {
        Log.e(Constants.LOG_TAG, "Artwork loading failed");
    }

    @Override
    public void onPrepareLoad(Drawable drawable) {
    }
};

...

private void playNextSong(int songPosition) {
    ...

    String artworkUrl = Constants.Urls.BASE_ARTWORK_URL + currentSong.getArtworkId();
    Picasso.with(this).load(artworkUrl).skipMemoryCache().into(artworkTarget);
    // Update the remote controls
    remoteControlClient.editMetadata(true)
                .putString(MediaMetadataRetriever.METADATA_KEY_ARTIST, currentSong.getArtist().getName())
                .putString(MediaMetadataRetriever.METADATA_KEY_ALBUM, currentSong.getAlbum().getName())
                .putString(MediaMetadataRetriever.METADATA_KEY_TITLE, currentSong.getName())
                .apply();

   ...
   }

But sometimes I get ‘Cannot draw recycled bitmaps’ exception. Here is stacktrace:

10-14 10:40:53.999: ERROR/AndroidRuntime(28716): FATAL EXCEPTION: main
        java.lang.IllegalArgumentException: Cannot draw recycled bitmaps
        at android.view.GLES20Canvas.drawBitmap(GLES20Canvas.java:772)
        at android.view.GLES20RecordingCanvas.drawBitmap(GLES20RecordingCanvas.java:105)
        at android.graphics.drawable.BitmapDrawable.draw(BitmapDrawable.java:440)
        at com.squareup.picasso.PicassoDrawable.draw(PicassoDrawable.java:96)
        at android.widget.ImageView.onDraw(ImageView.java:1025)
        at android.view.View.draw(View.java:13944)
        at android.view.View.getDisplayList(View.java:12838)
        at android.view.View.getDisplayList(View.java:12880)
        at android.view.View.draw(View.java:13657)
        at android.view.ViewGroup.drawChild(ViewGroup.java:3083)
        at android.view.ViewGroup.dispatchDraw(ViewGroup.java:2920)
        at android.view.View.draw(View.java:13947)
        at android.view.View.getDisplayList(View.java:12838)
        at android.view.View.getDisplayList(View.java:12880)
        at android.view.View.draw(View.java:13657)
        at android.view.ViewGroup.drawChild(ViewGroup.java:3083)
        at android.view.ViewGroup.dispatchDraw(ViewGroup.java:2920)
        at android.view.View.getDisplayList(View.java:12833)
        at android.view.View.getDisplayList(View.java:12880)
        at android.view.View.draw(View.java:13657)
        at android.view.ViewGroup.drawChild(ViewGroup.java:3083)
        at android.view.ViewGroup.dispatchDraw(ViewGroup.java:2920)
        at android.view.View.getDisplayList(View.java:12833)
        at android.view.View.getDisplayList(View.java:12880)
        at android.view.View.draw(View.java:13657)
        at android.view.ViewGroup.drawChild(ViewGroup.java:3083)
        at android.view.ViewGroup.dispatchDraw(ViewGroup.java:2920)
        at android.view.View.getDisplayList(View.java:12833)
        at android.view.View.getDisplayList(View.java:12880)
        at android.view.View.draw(View.java:13657)
        at android.view.ViewGroup.drawChild(ViewGroup.java:3083)
        at android.view.ViewGroup.dispatchDraw(ViewGroup.java:2920)
        at android.view.View.draw(View.java:13947)
        at android.widget.FrameLayout.draw(FrameLayout.java:467)
        at com.android.internal.policy.impl.PhoneWindow$DecorView.draw(PhoneWindow.java:2224)
        at android.view.View.getDisplayList(View.java:12838)
        at android.view.View.getDisplayList(View.java:12880)
        at android.view.HardwareRenderer$GlRenderer.buildDisplayList(HardwareRenderer.java:1411)
        at android.view.HardwareRenderer$GlRenderer.draw(HardwareRenderer.java:1359)
        at android.view.ViewRootImpl.draw(ViewRootImpl.java:2367)
        at android.view.ViewRootImpl.performDraw(ViewRootImpl.java:2239)
        at android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:1872)
        at android.view.ViewRootImpl.doTraversal(ViewRootImpl.java:1004)
        at android.view.ViewRootImpl$TraversalRunnable.run(ViewRootImpl.java:5481)
        at android.view.Choreographer$CallbackRecord.run(Choreographer.java:749)
        at android.view.Choreographer.doCallbacks(Choreographer.java:562)
        at android.view.Choreographer.doFrame(Choreographer.java:532)
        at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:735)
        at android.os.Handler.handleCallback(Handler.java:730)
        at android.os.Handler.dispatchMessage(Handler.java:92)
        at android.os.Looper.loop(Looper.java:137)
        at android.app.ActivityThread.main(ActivityThread.java:5103)
        at java.lang.reflect.Method.invokeNative(Native Method)
        at java.lang.reflect.Method.invoke(Method.java:525)
        at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:737)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:553)
        at dalvik.system.NativeStart.main(Native Method)

I didn’t manage to find some steps to reproduce it, but if I remove skipMemoryCache application will crash every time I loading image.

Is something wrong with my code? Maybe I should use Picasso in some other way?

P.S. Picasso version 2.1.1

Issue Analytics

  • State:closed
  • Created 10 years ago
  • Comments:18 (6 by maintainers)

github_iconTop GitHub Comments

3reactions
PaulWoitaschekcommented, May 24, 2015

I also faced this issue. Why isn’t Picasso checking for recycling?

public Bitmap get() {
    ...
    if (bitmap.isRecycled()) {
        return bitmap.copy(bitmap.getConfig(), true);
    } else {
        return bitmap;
    }
}
0reactions
diguagegecommented, Sep 9, 2016

@PaulWoitaschek This solution is perfect !!!

Read more comments on GitHub >

github_iconTop Results From Across the Web

IllegalArgumentException: Cannot draw recycled bitmaps
IllegalArgumentException : Cannot draw recycled bitmaps. So, I still seem to be in the "no longer" context. When do I get a new...
Read more >
java.lang.IllegalArgumentException: Cannot draw recycled ...
java.lang.IllegalArgumentException : Cannot draw recycled bitmaps at android.view.GLES20Canvas.drawBitmap(GLES20Canvas.java:791) at ...
Read more >
java.lang.IllegalArgumentException: Cannot draw recycled ...
java.lang.IllegalArgumentException : Cannot draw recycled bitmaps at android.view.GLES20Canvas.drawBitmap(GLES20Canvas.java). Summary: java.lang.
Read more >
Android – getting “Cannot draw recycled bitmaps” - iTecNote
Android – getting “Cannot draw recycled bitmaps” ... meaning it will throw an exception if getPixels() or setPixels() is called, and will draw...
Read more >
Buffer not large enough for pixels Bitmap.java android ...
Bitmap copyPixelsToBuffer 414 & Cannot draw recycled bitmaps GLES20Canvas.java android.view. ... I got the following exception, I using Android 4.3.
Read more >

github_iconTop Related Medium Post

No results found

github_iconTop Related StackOverflow Question

No results found

github_iconTroubleshoot Live Code

Lightrun enables developers to add logs, metrics and snapshots to live code - no restarts or redeploys required.
Start Free

github_iconTop Related Reddit Thread

No results found

github_iconTop Related Hackernoon Post

No results found

github_iconTop Related Tweet

No results found

github_iconTop Related Dev.to Post

No results found

github_iconTop Related Hashnode Post

No results found