Intereting Posts
IllegalArgumentException при добавлении облачных сообщений api в GoogleApiClient Отключить автоматическое изменение макета на Android Скрыть клавиатуру мягкого ввода, когда диалог закрывается Горизонтальный LinearLayout с несколькими детьми, перемещение детей ниже на новой линии, когда больше нет горизонтального пространства Как использовать addPreferencesFromResource для android 2.X? Android Keystore, безопасное значение ключа Не удалось загрузить обновленный APK в Google Play Store Возможно ли создать межплатформенную библиотеку с MonoDroid и MonoTouch, которые могут использоваться разработчиками, не являющимися Mono? Android – Как получить выбранное имя файла из документа Только в некоторых телефонах ListView не обновляется после notifyDataSetChanged () Проблемы с android.location.geocoder Fatal Exception: java.lang.NoClassDefFoundError: rt Лучшие практики: макеты на Android (Programmatic vs XML) Эффективные «скриншоты» просмотра? Как создать собственный просмотрщик PDF для Android?

Canvas: попытка использования переработанного растрового андроида

Я постоянно сталкиваюсь с этой проблемой, и я не знаю, что с этим делать.

Я использовал эту библиотеку, и когда я получаю обрезанное изображение, я сохраняю его в статической переменной и перехожу к следующему действию. Когда я прихожу в следующую операцию, я ссылаюсь на эту статическую переменную, чтобы получить растровое изображение и попытаться его масштабировать. Но это дает мне ошибку.

Вот что я делаю.

public void buttonCropClick(View view) throws IOException { imageView.setDrawingCacheEnabled(true); imageView.buildDrawingCache(true); Snapshot.CroppedBitmap = imageView.getDrawingCache(true); imageView.setDrawingCacheEnabled(false); startActivity(new Intent(this,RecommendationInfo.class)); } 

В классе RecommendationInfo я получаю растровое изображение в следующей строке Snapshot.CroppedBitmap = imageView.getDrawingCache(true); То я сохраняю это растровое изображение в статической переменной, которую я ссылаюсь в следующей активности и передаю ее следующей функции.

 public static Bitmap scaleDown(Bitmap realImage,boolean filter) { float maxImageSize = HeightToSet; float ratio = Math.min( (float) maxImageSize / realImage.getWidth(), (float) maxImageSize / realImage.getHeight()); int width = Math.round((float) ratio * realImage.getWidth()); int height = Math.round((float) ratio * realImage.getHeight()); // Error here Bitmap newBitmap = Bitmap.createScaledBitmap(realImage, width,height, filter); return newBitmap; } 

Я уже пробовал вызывать bitmap.recycle() . Почему я получаю эту проблему, что могу сделать, чтобы ее решить? Вот мой логарифм.

 07-14 03:09:43.713: E/AndroidRuntime(19653): FATAL EXCEPTION: main 07-14 03:09:43.713: E/AndroidRuntime(19653): java.lang.RuntimeException: Canvas: trying to use a recycled bitmap android.graphics.Bitmap@4059b8b8 07-14 03:09:43.713: E/AndroidRuntime(19653): at android.graphics.Canvas.throwIfRecycled(Canvas.java:955) 07-14 03:09:43.713: E/AndroidRuntime(19653): at android.graphics.Canvas.drawBitmap(Canvas.java:1012) 07-14 03:09:43.713: E/AndroidRuntime(19653): at android.graphics.Bitmap.createBitmap(Bitmap.java:462) 07-14 03:09:43.713: E/AndroidRuntime(19653): at android.graphics.Bitmap.createScaledBitmap(Bitmap.java:349) 07-14 03:09:43.713: E/AndroidRuntime(19653): at com.example.Libraries.Snapshot.scaleDown(Snapshot.java:42) 07-14 03:09:43.713: E/AndroidRuntime(19653): at com.example.androidtestproject.RecommendationInfo.SetRecommendationValues(RecommendationInfo.java:195) 07-14 03:09:43.713: E/AndroidRuntime(19653): at com.example.androidtestproject.RecommendationInfo.access$5(RecommendationInfo.java:183) 07-14 03:09:43.713: E/AndroidRuntime(19653): at com.example.androidtestproject.RecommendationInfo$1.onClick(RecommendationInfo.java:154) 07-14 03:09:43.713: E/AndroidRuntime(19653): at android.view.View.performClick(View.java:2552) 07-14 03:09:43.713: E/AndroidRuntime(19653): at android.view.View$PerformClick.run(View.java:9229) 07-14 03:09:43.713: E/AndroidRuntime(19653): at android.os.Handler.handleCallback(Handler.java:587) 07-14 03:09:43.713: E/AndroidRuntime(19653): at android.os.Handler.dispatchMessage(Handler.java:92) 07-14 03:09:43.713: E/AndroidRuntime(19653): at android.os.Looper.loop(Looper.java:138) 07-14 03:09:43.713: E/AndroidRuntime(19653): at android.app.ActivityThread.main(ActivityThread.java:3701) 07-14 03:09:43.713: E/AndroidRuntime(19653): at java.lang.reflect.Method.invokeNative(Native Method) 07-14 03:09:43.713: E/AndroidRuntime(19653): at java.lang.reflect.Method.invoke(Method.java:507) 07-14 03:09:43.713: E/AndroidRuntime(19653): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:878) 07-14 03:09:43.713: E/AndroidRuntime(19653): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:636) 07-14 03:09:43.713: E/AndroidRuntime(19653): at dalvik.system.NativeStart.main(Native Method) 07-14 03:09:45.515: E/TAG(20039): End of input at character 0 of 

Solutions Collecting From Web of "Canvas: попытка использования переработанного растрового андроида"

Скопируйте растровое изображение, прежде чем передавать его статической переменной.

 Snapshot.CroppedBitmap = imageView.getDrawingCache(true); 

в

 Snapshot.CroppedBitmap = Bitmap.createBitmap(imageView.getDrawingCache(true)); 

Весьма вероятно, что imageView перерабатывает свой кэш чертежа, когда он больше не нужен в качестве хорошей практики. Скопировав его, вы сохраните ссылку на растровое изображение, которое обработал ImageView. Просто сделайте копию этого, что вы можете управлять собой!

Сначала нужно скопировать исходное изображение:

 Bitmap bitmap = webview.getDrawingCache(); if (bitmap != null) { Snapshot.CroppedBitmap.setImageBitmap(bitmap.copy(bitmap.getConfig(), false)); } 
  • Использование createBitmap не обязательно создаст копию исходного растрового изображения, что приведет к той же ошибке.