Что вызывает исключение?

240
15 октября 2017, 21:14
E: FATAL EXCEPTION: main
   Process: *, PID: 22482
   java.lang.RuntimeException: Canvas: trying to use a recycled bitmap android.graphics.Bitmap@24e46ab
       at android.graphics.Canvas.throwIfCannotDraw(Canvas.java:1280)
       at android.view.DisplayListCanvas.throwIfCannotDraw(DisplayListCanvas.java:257)
       at android.graphics.Canvas.drawBitmap(Canvas.java:1424)
       at android.graphics.drawable.BitmapDrawable.draw(BitmapDrawable.java:528)
       at android.widget.ImageView.onDraw(ImageView.java:1316)
       at android.view.View.draw(View.java:17293)
       at android.view.View.updateDisplayListIfDirty(View.java:16275)
       at android.view.View.draw(View.java:17059)
       at android.view.ViewGroup.drawChild(ViewGroup.java:3731)
       at android.view.ViewGroup.dispatchDraw(ViewGroup.java:3517)
       at android.view.View.updateDisplayListIfDirty(View.java:16270)
       at android.view.ViewGroup.recreateChildDisplayList(ViewGroup.java:3715)
       at android.view.ViewGroup.dispatchGetDisplayList(ViewGroup.java:3695)
       at android.view.View.updateDisplayListIfDirty(View.java:16238)
       at android.view.ViewGroup.recreateChildDisplayList(ViewGroup.java:3715)
       at android.view.ViewGroup.dispatchGetDisplayList(ViewGroup.java:3695)
       at android.view.View.updateDisplayListIfDirty(View.java:16238)
       at android.view.ViewGroup.recreateChildDisplayList(ViewGroup.java:3715)
       at android.view.ViewGroup.dispatchGetDisplayList(ViewGroup.java:3695)
       at android.view.View.updateDisplayListIfDirty(View.java:16238)
       at android.view.ViewGroup.recreateChildDisplayList(ViewGroup.java:3715)
       at android.view.ViewGroup.dispatchGetDisplayList(ViewGroup.java:3695)
       at android.view.View.updateDisplayListIfDirty(View.java:16238)
       at android.view.ViewGroup.recreateChildDisplayList(ViewGroup.java:3715)
       at android.view.ViewGroup.dispatchGetDisplayList(ViewGroup.java:3695)
       at android.view.View.updateDisplayListIfDirty(View.java:16238)
       at android.view.ViewGroup.recreateChildDisplayList(ViewGroup.java:3715)
       at android.view.ViewGroup.dispatchGetDisplayList(ViewGroup.java:3695)
       at android.view.View.updateDisplayListIfDirty(View.java:16238)
       at android.view.ViewGroup.recreateChildDisplayList(ViewGroup.java:3715)
       at android.view.ViewGroup.dispatchGetDisplayList(ViewGroup.java:3695)
       at android.view.View.updateDisplayListIfDirty(View.java:16238)
       at android.view.ThreadedRenderer.updateViewTreeDisplayList(ThreadedRenderer.java:652)
       at android.view.ThreadedRenderer.updateRootDisplayList(ThreadedRenderer.java:658)
       at android.view.ThreadedRenderer.draw(ThreadedRenderer.java:766)
       at android.view.ViewRootImpl.draw(ViewRootImpl.java:2834)
       at android.view.ViewRootImpl.performDraw(ViewRootImpl.java:2642)
       at android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:2249)
       at android.view.ViewRootImpl.doTraversal(ViewRootImpl.java:1280)
       at android.view.ViewRootImpl$TraversalRunnable.run(ViewRootImpl.java:6432)
       at android.view.Choreographer$CallbackRecord.run(Choreographer.java:874)
       at android.view.Choreographer.doCallbacks(Choreographer.java:686)
       at android.view.Choreographer.doFrame(Choreographer.java:621)
       at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:860)
       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:6374)
       at java.lang.reflect.Method.invoke(Native Method)
       at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:886)
       at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:776)
D: App Event: crash

Приложение падает, но как понять, что и где заставляет его падать? Смотрел debugger'ом, но там все приблизительно тоже самое, нет ни одного метода моего приложения - только стандартные.

Answer 1

Его вызывает bitmap.recycle(). Быстрое решение не должно вызывать bitmap.recycle();, что строго не требуется для android >2.3.3. Если вы все равно хотите освободить эту память, вам нужно будет найти способ проверить, когда битмап действительно больше не нужен (т. е. Canvas имел возможность завершить операции рисования).

https://stackoverflow.com/a/31227624/4854931

if (mBitmap != null && !mBitmap.isRecycled()) {
    mBitmap.recycle();
    mBitmap = null; 
}

https://stackoverflow.com/a/22129476/4854931

READ ALSO
Коллекции. Добавление элемента

Коллекции. Добавление элемента

Доброго времени сутокНовичок в Java, прохожу коллекции и возник вопрос

136
Вызов View не из главного потока

Вызов View не из главного потока

У меня есть 2 класса: MainActivity, ChatsCommunicator и интерфейс IView

171