MikeOrtiz / TouchImageView

Adds touch functionality to Android ImageView.

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

Crashing during load large bitmap

soura216 opened this issue · comments

java.lang.RuntimeException:
at android.graphics.RecordingCanvas.throwIfCannotDraw (RecordingCanvas.java:281)
at android.graphics.BaseRecordingCanvas.drawBitmap (BaseRecordingCanvas.java:91)
at android.graphics.drawable.BitmapDrawable.draw (BitmapDrawable.java:548)
at android.widget.ImageView.onDraw (ImageView.java:1434)
at com.ortiz.touchview.TouchImageView.onDraw (TouchImageView.kt: 284)
at android.view.View.draw (View.java:23191)
at android.view.View.updateDisplayListIfDirty (View.java:22066)
at android.view.View.draw (View.java:22921)
at android.view.ViewGroup.drawChild (ViewGroup.java:5230)
at android.view.ViewGroup.dispatchDraw (ViewGroup.java:4987)

I'm done here. To less info

image

The issue was not fixed yet

Crashing Device : Samsung Galaxy M31

java.lang.RuntimeException:
at android.graphics.RecordingCanvas.throwIfCannotDraw (RecordingCanvas.java:281)
at android.graphics.BaseRecordingCanvas.drawBitmap (BaseRecordingCanvas.java:91)
at android.graphics.drawable.BitmapDrawable.draw (BitmapDrawable.java:548)
at android.widget.ImageView.onDraw (ImageView.java:1434)
at com.ortiz.touchview.TouchImageView.onDraw (TouchImageView.kt:284)
at android.view.View.draw (View.java:23191)
at android.view.View.updateDisplayListIfDirty (View.java:22066)
at android.view.View.draw (View.java:22921)
at android.view.ViewGroup.drawChild (ViewGroup.java:5230)
at android.view.ViewGroup.dispatchDraw (ViewGroup.java:4987)
at android.view.View.draw (View.java:23194)
at androidx.viewpager.widget.ViewPager.draw (ViewPager.java:2426)
at android.view.View.updateDisplayListIfDirty (View.java:22066)
at android.view.View.draw (View.java:22921)
at android.view.ViewGroup.drawChild (ViewGroup.java:5230)
at android.view.ViewGroup.dispatchDraw (ViewGroup.java:4987)
at android.view.View.draw (View.java:23194)
at android.view.View.updateDisplayListIfDirty (View.java:22066)
at android.view.View.draw (View.java:22921)
at android.view.ViewGroup.drawChild (ViewGroup.java:5230)
at android.view.ViewGroup.dispatchDraw (ViewGroup.java:4987)
at android.view.View.updateDisplayListIfDirty (View.java:22052)
at android.view.View.draw (View.java:22921)
at android.view.ViewGroup.drawChild (ViewGroup.java:5230)
at android.view.ViewGroup.dispatchDraw (ViewGroup.java:4987)
at android.view.View.updateDisplayListIfDirty (View.java:22052)
at android.view.View.draw (View.java:22921)
at android.view.ViewGroup.drawChild (ViewGroup.java:5230)
at android.view.ViewGroup.dispatchDraw (ViewGroup.java:4987)
at android.view.View.updateDisplayListIfDirty (View.java:22052)
at android.view.View.draw (View.java:22921)
at android.view.ViewGroup.drawChild (ViewGroup.java:5230)
at android.view.ViewGroup.dispatchDraw (ViewGroup.java:4987)
at android.view.View.updateDisplayListIfDirty (View.java:22052)
at android.view.View.draw (View.java:22921)
at android.view.ViewGroup.drawChild (ViewGroup.java:5230)
at android.view.ViewGroup.dispatchDraw (ViewGroup.java:4987)
at android.view.View.draw (View.java:23194)
at com.android.internal.policy.DecorView.draw (DecorView.java:1114)
at android.view.View.updateDisplayListIfDirty (View.java:22066)
at android.view.ThreadedRenderer.updateViewTreeDisplayList (ThreadedRenderer.java:588)
at android.view.ThreadedRenderer.updateRootDisplayList (ThreadedRenderer.java:594)
at android.view.ThreadedRenderer.draw (ThreadedRenderer.java:667)
at android.view.ViewRootImpl.draw (ViewRootImpl.java:4263)
at android.view.ViewRootImpl.performDraw (ViewRootImpl.java:4047)
at android.view.ViewRootImpl.performTraversals (ViewRootImpl.java:3320)
at android.view.ViewRootImpl.doTraversal (ViewRootImpl.java:2200)
at android.view.ViewRootImpl$TraversalRunnable.run (ViewRootImpl.java:8960)
at android.view.Choreographer$CallbackRecord.run (Choreographer.java:996)
at android.view.Choreographer.doCallbacks (Choreographer.java:794)
at android.view.Choreographer.doFrame (Choreographer.java:729)
at android.view.Choreographer$FrameDisplayEventReceiver.run (Choreographer.java:981)
at android.os.Handler.handleCallback (Handler.java:883)
at android.os.Handler.dispatchMessage (Handler.java:100)
at android.os.Looper.loop (Looper.java:237)
at android.app.ActivityThread.main (ActivityThread.java:7814)
at java.lang.reflect.Method.invoke (Native Method)
at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run (RuntimeInit.java:493)
at com.android.internal.os.ZygoteInit.main (ZygoteInit.java:1068)

To less info

Send a stacktrace it definitely to less, especially when it comes from android.widget.ImageView.onDraw (ImageView.java:1434)
Make it reproduce able, otherwise it's a local problem.

The issue was not fixed yet

Crashing Device : Samsung Galaxy M31

Please make a test, where the error is raised in CI, then it makes sense for me to jump in

I'm done here. To less info

image

I'm done here. To less info

image

Do you update your library after fixing it. I am using you implementation 'com.github.MikeOrtiz:TouchImageView:3.0.5'

I fixed nothing here concerning this issue. This is an open source project, even the history is public and everyone in warmly welcome to contribute

Please help someone to fix the issue

Same problem:
Fatal Exception: java.lang.RuntimeException: Canvas: trying to draw too large(192000000bytes) bitmap. at android.view.DisplayListCanvas.throwIfCannotDraw(DisplayListCanvas.java:229) at android.view.RecordingCanvas.drawBitmap(RecordingCanvas.java:97) at android.graphics.drawable.BitmapDrawable.draw(BitmapDrawable.java:529) at android.widget.ImageView.onDraw(ImageView.java:1367)

Affecting large number of users

We are also affected by this, full stacktrace:

Fatal Exception: java.lang.RuntimeException: Canvas: trying to draw too large(245401728bytes) bitmap.
       at android.graphics.RecordingCanvas.throwIfCannotDraw(RecordingCanvas.java:281)
       at android.graphics.BaseRecordingCanvas.drawBitmap(BaseRecordingCanvas.java:91)
       at android.graphics.drawable.BitmapDrawable.draw(BitmapDrawable.java:548)
       at android.widget.ImageView.onDraw(ImageView.java:1453)
       at x.x.x.TouchImageView.onDraw(TouchImageView.java:289)
       at android.view.View.draw(View.java:23901)
       at android.view.View.updateDisplayListIfDirty(View.java:22776)
       at android.view.View.draw(View.java:23631)
       at android.view.ViewGroup.drawChild(ViewGroup.java:5336)
       at android.view.ViewGroup.dispatchDraw(ViewGroup.java:5093)
       at android.view.View.updateDisplayListIfDirty(View.java:22762)
       at android.view.View.draw(View.java:23631)
       at android.view.ViewGroup.drawChild(ViewGroup.java:5336)
       at android.view.ViewGroup.dispatchDraw(ViewGroup.java:5093)
       at android.view.View.draw(View.java:23904)
       at androidx.viewpager.widget.ViewPager.draw(ViewPager.java:2426)
       at android.view.View.updateDisplayListIfDirty(View.java:22776)
       at android.view.View.draw(View.java:23631)
       at android.view.ViewGroup.drawChild(ViewGroup.java:5336)
       at android.view.ViewGroup.dispatchDraw(ViewGroup.java:5093)
       at android.view.View.updateDisplayListIfDirty(View.java:22762)
       at android.view.View.draw(View.java:23631)
       at android.view.ViewGroup.drawChild(ViewGroup.java:5336)
       at android.view.ViewGroup.dispatchDraw(ViewGroup.java:5093)
       at android.view.View.updateDisplayListIfDirty(View.java:22762)
       at android.view.View.draw(View.java:23631)
       at android.view.ViewGroup.drawChild(ViewGroup.java:5336)
       at android.view.ViewGroup.dispatchDraw(ViewGroup.java:5093)
       at android.view.View.updateDisplayListIfDirty(View.java:22762)
       at android.view.View.draw(View.java:23631)
       at android.view.ViewGroup.drawChild(ViewGroup.java:5336)
       at android.view.ViewGroup.dispatchDraw(ViewGroup.java:5093)
       at android.view.View.draw(View.java:23904)
       at com.android.internal.policy.DecorView.draw(DecorView.java:1282)
       at android.view.View.updateDisplayListIfDirty(View.java:22776)
       at android.view.ThreadedRenderer.updateViewTreeDisplayList(ThreadedRenderer.java:579)
       at android.view.ThreadedRenderer.updateRootDisplayList(ThreadedRenderer.java:585)
       at android.view.ThreadedRenderer.draw(ThreadedRenderer.java:662)
       at android.view.ViewRootImpl.draw(ViewRootImpl.java:4994)
       at android.view.ViewRootImpl.performDraw(ViewRootImpl.java:4701)
       at android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:3818)
       at android.view.ViewRootImpl.doTraversal(ViewRootImpl.java:2575)
       at android.view.ViewRootImpl$TraversalRunnable.run(ViewRootImpl.java:9916)
       at android.view.Choreographer$CallbackRecord.run(Choreographer.java:1010)
       at android.view.Choreographer.doCallbacks(Choreographer.java:809)
       at android.view.Choreographer.doFrame(Choreographer.java:744)
       at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:995)
       at android.os.Handler.handleCallback(Handler.java:938)
       at android.os.Handler.dispatchMessage(Handler.java:99)
       at android.os.Looper.loop(Looper.java:246)
       at android.app.ActivityThread.main(ActivityThread.java:8512)
       at java.lang.reflect.Method.invoke(Method.java)
       at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:602)
       at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1130)

It comes from standard ImageView
image

Please change to a normal ImageView and observe if it's happen there too. I expect there will be no difference and you will see the problem there too.

Or please provide a reproduceable sample.

I'm having this issue with Viewpager2 and Glide. But I think this is not related with TouchImageView library.
Try to follow up here: bumptech/glide#3775

For anyone who care, I have to downscaling the image before setImageDrawable.

        fun bind(imageUrl: String) {
            val width = binding.root.context.resources.displayMetrics.widthPixels

            requestManager.load(imageUrl)
                .apply(RequestOptions().override(width))
                .into(object : CustomTarget<Drawable?>() {
                    override fun onResourceReady(
                        resource: Drawable,
                        transition: Transition<in Drawable?>?
                    ) {
                        binding.touchImageView.setImageDrawable(resource)
                    }

                    override fun onLoadCleared(@Nullable placeholder: Drawable?) = Unit
                })
        }