Подтвердить что ты не робот

Android пытается использовать переработанное растровое изображение, а не в моем коде

Я получаю эту стекю от консоли разработчика Market каждый раз в то время; Я не могу найти способ воспроизвести ошибку. Это происходит при отображении splashscreen ImageView, поскольку приложение загружается первым, но у stacktrace нет моего кода. Я даже не думаю, что моя активность даже достигла onCreate, хотя это трудно сказать без журнала.

В самом деле, я никогда не использую Bitmap нигде в моем коде; моя единственная ссылка на изображение находится в моем layout.xml.

<ImageView android:id="@+id/splashScreen"
  android:layout_height="fill_parent"
  android:layout_width="fill_parent"
  android:src="@drawable/splashscreen"
  android:scaleType="fitXY"
/>

Единственное, что я делаю с этим ImageView, - установить его видимость на GONE, когда я закончу запуск.

Что я могу с этим поделать?

java.lang.RuntimeException: Canvas: trying to use a recycled bitmap [email protected]
at android.graphics.Canvas.throwIfRecycled(Canvas.java:955)
at android.graphics.Canvas.drawBitmap(Canvas.java:1044)
at android.graphics.drawable.BitmapDrawable.draw(BitmapDrawable.java:323)
at android.widget.ImageView.onDraw(ImageView.java:923)
at android.view.View.draw(View.java:6761)
at android.view.ViewGroup.drawChild(ViewGroup.java:1663)
at android.view.ViewGroup.dispatchDraw(ViewGroup.java:1390)
at android.view.View.buildDrawingCache(View.java:6517)
at android.view.View.getDrawingCache(View.java:6305)
at android.view.ViewGroup.drawChild(ViewGroup.java:1588)
at android.view.ViewGroup.dispatchDraw(ViewGroup.java:1390)
at android.view.ViewGroup.drawChild(ViewGroup.java:1661)
at android.view.ViewGroup.dispatchDraw(ViewGroup.java:1409)
at android.view.View.draw(View.java:6764)
at android.widget.FrameLayout.draw(FrameLayout.java:352)
at android.view.ViewGroup.drawChild(ViewGroup.java:1663)
at android.view.ViewGroup.dispatchDraw(ViewGroup.java:1390)
at android.view.ViewGroup.drawChild(ViewGroup.java:1661)
at android.view.ViewGroup.dispatchDraw(ViewGroup.java:1390)
at android.view.ViewGroup.drawChild(ViewGroup.java:1661)
at android.view.ViewGroup.dispatchDraw(ViewGroup.java:1390)
at android.view.View.draw(View.java:6764)
at android.widget.FrameLayout.draw(FrameLayout.java:352)
at android.view.ViewGroup.drawChild(ViewGroup.java:1663)
at android.view.ViewGroup.dispatchDraw(ViewGroup.java:1390)
at android.view.ViewGroup.drawChild(ViewGroup.java:1661)
at android.view.ViewGroup.dispatchDraw(ViewGroup.java:1390)
at android.view.View.draw(View.java:6764)
at android.widget.FrameLayout.draw(FrameLayout.java:352)
at com.android.internal.policy.impl.PhoneWindow$DecorView.draw(PhoneWindow.java:1887)
at android.view.ViewRoot.draw(ViewRoot.java:1432)
at android.view.ViewRoot.performTraversals(ViewRoot.java:1167)
at android.view.ViewRoot.handleMessage(ViewRoot.java:1764)
at android.os.Handler.dispatchMessage(Handler.java:99)
at android.os.Looper.loop(Looper.java:143)
at android.app.ActivityThread.main(ActivityThread.java:5068)
at java.lang.reflect.Method.invokeNative(Native Method)
at java.lang.reflect.Method.invoke(Method.java:521)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:858)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616)
at dalvik.system.NativeStart.main(Native Method)
4b9b3361

Ответ 1

Это исключение возникает при попытке утилизации или использования переработанного растрового изображения. Вы не должны удалять функцию bitmap.recycle() из вашего существующего кода, это может привести к ошибке из памяти. Вы можете попробовать этот ниже код, чтобы исправить проблему.

BitmapDrawable bitmapDrawable = ((BitmapDrawable) profileWallpaper.getDrawable());

                if (null != bitmapDrawable && !bitmapDrawable.getBitmap().isRecycled()) {

                    bitmapDrawable.getBitmap().recycle();
                } else {

                    log("bitmap is already recycled");
                }

                bitmapDrawable = null;

Примечание: profileWallpaper - это ваш объект imageView

Ответ 2

Если вы перерабатываете растровое изображение где-то в своем коде, вы должны быть уверены, что при перезапуске приложения ваше растровое изображение будет воссоздано. Когда вы проходите через onCreate, никаких проблем, но когда приложение находится в состоянии паузы и перезапущено, он снова не будет проходить через onCreate, просто через onResume. Я думаю, вы могли бы воссоздать свои растровые изображения в методе onResume, но использовать флаг для создания растрового изображения в onCreate или inResume, а не для обоих (onCreate и onResume вызываются вместе при запуске приложения, и вы можете тратить процессорные циклы).

Ответ 3

Вы не должны использовать одни и те же ресурсы изображения для разных видов деятельности, в то время как один из них выполняет переработку его растрового изображения.

Если у вас есть такая ситуация, измените ресурс изображения одного из этих действий.

Ответ 4

Вы пытались опустить изображение? Это случалось со мной много раз. Если проблема повторяется после изменения изображения, это означает, что проблема находится в другом месте... Я бы посмотрел в методе создания на основе вашего основного действия или кода заставки.

извините мой дерьмовый английский:)

C ya!

Ответ 5

Просто решил проблему с похожим журналом сбоев. В моем случае это был только второй ProgressBar внутри фрагмента. У меня было два списка внутри него и ProgressBars для каждого из них. Удаление второй проблемы. Я могу только догадываться, что они использовали один и тот же растровый ресурс для фона или анимации...

Я потратил много времени, чтобы понять его причину, и это был просто стандартный ProgressBar!:/ Надеюсь, что это поможет кому-то сэкономить время и душевное спокойствие.

Ответ 6

У меня был тот же Exception, который не появился из моего приложения, и выяснил, что он не связан с AdMob.

Проблема возникает, когда вы перерабатываете ресурс BitmapDrawable, который был установлен через XML, на ваш ImageView.

Во время возобновления андроид не расшифровывает изображение снова, будет ли оно переработано или нет, поэтому вы получаете Canvas: trying to use a recycled bitmap.

Способом решения этой проблемы является перезагрузка соответствующего BitmapDrawable в onPause вашего Activity, чтобы андроид не жаловался на то, что растровое изображение переработано.

Вот как это сделать:

Bitmap selectImage = BitmapFactory.decodeResource(getResources(), R.drawable.your_bitmap_drawable);
yourImageView.setImageBitmap(selectImage);

Edit: Я понял, что просто настройка Drawable от yourImageView до null также предотвращает эту ошибку. Только не оставляйте Drawable, у которого есть переработанный Bitmap. Пример кода:

yourImageView.setImageDrawable(null);