Recycle Bitmap бросить ошибку Android 8 и 9 - PullRequest
0 голосов
/ 15 октября 2019

Я пытаюсь устранить ошибку, которая возникает только в Android 8 и 9. Я смотрю в некоторых постах, но они старые. Я нахожу в Android Doc решения для Android 3 и новее, но я думаю, что эта ошибка происходит для чего-то нового. Я пытался разрешить с помощью информации о документах, но я не могу импортировать какой-либо класс, например 'RecyclingBitmapDrawable'

Здесь документ Android: https://developer.android.com/topic/performance/graphics/manage-memory#kotlin

И сообщение, которое я прочитал: Холст: попытка использовать переработанную ошибку растрового изображения

Я пытаюсь контролировать эту растровую ошибку с помощью этого кода.

companion object {
    private var bitmapResource: Bitmap? = null
    fun getCropBitmapResource(context: Context): Bitmap {
      if (bitmapResource == null) {
        bitmapResource = drawableResourceToBitmap(context, R.drawable.ic_select)
      }
      return bitmapResource!!
    }
}

fun drawableResourceToBitmap(context: Context, imageResource: Int): Bitmap {
      val drawable = AppCompatDrawableManager.get().getDrawable(context, imageResource)
      val bitmapResource = Bitmap.createBitmap(drawable.intrinsicWidth, drawable.intrinsicHeight, Bitmap.Config.ARGB_8888)
      val canvas = Canvas(bitmapResource)

      drawable.setBounds(0, 0, canvas.width, canvas.height)
      drawable.draw(canvas)
      return bitmapResource
}

Здесь ошибка

Canvas: trying to use a recycled bitmap android.graphics.Bitmap@73618ca
android.graphics.BaseCanvas.throwIfCannotDraw (BaseCanvas.java:62)
android.view.DisplayListCanvas.throwIfCannotDraw (DisplayListCanvas.java:226)
android.view.RecordingCanvas.drawBitmap (RecordingCanvas.java:98)
android.graphics.drawable.BitmapDrawable.draw (BitmapDrawable.java:545)
android.widget.ImageView.onDraw (ImageView.java:1360)
android.view.View.draw (View.java:20234)
android.view.View.updateDisplayListIfDirty (View.java:19109)
android.view.View.draw (View.java:19962)
android.view.ViewGroup.drawChild (ViewGroup.java:4337)
android.view.ViewGroup.dispatchDraw (ViewGroup.java:4114)
android.view.View.draw (View.java:20237)
android.view.View.updateDisplayListIfDirty (View.java:19109)
android.view.View.draw (View.java:19962)
android.view.ViewGroup.drawChild (ViewGroup.java:4337)
android.view.ViewGroup.dispatchDraw (ViewGroup.java:4114)
androidx.constraintlayout.widget.ConstraintLayout.dispatchDraw (ConstraintLayout.java:2023)
android.view.View.updateDisplayListIfDirty (View.java:19100)
android.view.View.draw (View.java:19962)
android.view.ViewGroup.drawChild (ViewGroup.java:4337)
android.view.ViewGroup.dispatchDraw (ViewGroup.java:4114)
android.view.View.draw (View.java:20237)
android.view.View.updateDisplayListIfDirty (View.java:19109)
android.view.View.draw (View.java:19962)
android.view.ViewGroup.drawChild (ViewGroup.java:4337)
android.view.ViewGroup.dispatchDraw (ViewGroup.java:4114)
android.view.View.draw (View.java:20237)
androidx.viewpager.widget.ViewPager.draw (ViewPager.java:2426)
android.view.View.updateDisplayListIfDirty (View.java:19109)
android.view.View.draw (View.java:19962)
android.view.ViewGroup.drawChild (ViewGroup.java:4337)
android.view.ViewGroup.dispatchDraw (ViewGroup.java:4114)
androidx.constraintlayout.widget.ConstraintLayout.dispatchDraw (ConstraintLayout.java:2023)
android.view.View.draw (View.java:20237)
android.view.View.updateDisplayListIfDirty (View.java:19109)
android.view.View.draw (View.java:19962)
android.view.ViewGroup.drawChild (ViewGroup.java:4337)
android.view.ViewGroup.dispatchDraw (ViewGroup.java:4114)
android.view.View.updateDisplayListIfDirty (View.java:19100)
android.view.View.draw (View.java:19962)
android.view.ViewGroup.drawChild (ViewGroup.java:4337)
android.view.ViewGroup.dispatchDraw (ViewGroup.java:4114)
android.view.View.updateDisplayListIfDirty (View.java:19100)
android.view.View.draw (View.java:19962)
android.view.ViewGroup.drawChild (ViewGroup.java:4337)
android.view.ViewGroup.dispatchDraw (ViewGroup.java:4114)
android.view.View.updateDisplayListIfDirty (View.java:19100)
android.view.View.draw (View.java:19962)
android.view.ViewGroup.drawChild (ViewGroup.java:4337)
android.view.ViewGroup.dispatchDraw (ViewGroup.java:4114)
android.view.View.updateDisplayListIfDirty (View.java:19100)
android.view.View.draw (View.java:19962)
android.view.ViewGroup.drawChild (ViewGroup.java:4337)
android.view.ViewGroup.dispatchDraw (ViewGroup.java:4114)
android.view.View.draw (View.java:20237)
com.android.internal.policy.DecorView.draw (DecorView.java:784)
android.view.View.updateDisplayListIfDirty (View.java:19109)
android.view.ThreadedRenderer.updateViewTreeDisplayList (ThreadedRenderer.java:686)
android.view.ThreadedRenderer.updateRootDisplayList (ThreadedRenderer.java:692)
android.view.ThreadedRenderer.draw (ThreadedRenderer.java:801)
android.view.ViewRootImpl.draw (ViewRootImpl.java:3361)
android.view.ViewRootImpl.performDraw (ViewRootImpl.java:3158)
android.view.ViewRootImpl.performTraversals (ViewRootImpl.java:2527)
android.view.ViewRootImpl.doTraversal (ViewRootImpl.java:1500)
android.view.ViewRootImpl$TraversalRunnable.run (ViewRootImpl.java:7342)
android.view.Choreographer$CallbackRecord.run (Choreographer.java:1036)
android.view.Choreographer.doCallbacks (Choreographer.java:832)
android.view.Choreographer.doFrame (Choreographer.java:767)
android.view.Choreographer$FrameDisplayEventReceiver.run (Choreographer.java:1022)
android.os.Handler.handleCallback (Handler.java:873)
android.os.Handler.dispatchMessage (Handler.java:99)
android.os.Looper.loop (Looper.java:201)
android.app.ActivityThread.main (ActivityThread.java:6810)
java.lang.reflect.Method.invoke (Method.java)
com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run (RuntimeInit.java:547)
com.android.internal.os.ZygoteInit.main (ZygoteInit.java:873)

Я не вызываю recycle () ни в одной части своего кода.

1 Ответ

0 голосов
/ 15 октября 2019

используйте этот код для конвертации

Bitmap bmp = BitmapFactory.decodeResource(getResources(), R.drawable.image);

вы должны использовать

BitmapFactory

для конвертации.

Отредактировано: тот же метод в Java, может быть, поможет

public static Bitmap drawableToBitmap (Drawable drawable) {

if (drawable instanceof BitmapDrawable) {
    return ((BitmapDrawable)drawable).getBitmap();
}

Bitmap bitmap = Bitmap.createBitmap(drawable.getIntrinsicWidth(), 
drawable.getIntrinsicHeight(), Config.ARGB_8888);
Canvas canvas = new Canvas(bitmap); 
drawable.setBounds(0, 0, canvas.getWidth(), canvas.getHeight());
drawable.draw(canvas);

return bitmap;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...