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)
Ответы
Ответ 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);