MikeOrtiz / TouchImageView

Adds touch functionality to Android ImageView.
MIT License
2.72k stars 864 forks source link

Crashing during load large bitmap #350

Closed soura216 closed 2 years ago

soura216 commented 3 years ago

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)

hannesa2 commented 3 years ago

I'm done here. To less info

image
soura216 commented 3 years ago

The issue was not fixed yet

Crashing Device : Samsung Galaxy M31

soura216 commented 3 years ago

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)

hannesa2 commented 3 years ago

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.

hannesa2 commented 3 years ago

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

soura216 commented 3 years ago

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'

hannesa2 commented 3 years ago

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

soura216 commented 3 years ago

Please help someone to fix the issue

diegogalico commented 3 years ago

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

iliaskomp commented 3 years ago

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)
hannesa2 commented 3 years ago

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.

chicken-space-invader commented 2 years ago

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

chicken-space-invader commented 2 years ago

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
                })
        }