天天看点

异常:java.lang.RuntimeException: Canvas: trying to draw too large(161740800bytes) bitmap

一大早产品经理拿着他的安卓手机(红米note 4X,安卓7.0系统)过来,说安装了昨天打包的app根本无法启动,我拿几个测试机安装试了下,都没有问题,只好拿他手机来调试一下,下面是报错日志:

java.lang.RuntimeException: Canvas: trying to draw too large(161740800bytes) bitmap.
at android.view.DisplayListCanvas.throwIfCannotDraw(DisplayListCanvas.java:260)
at android.graphics.Canvas.drawBitmap(Canvas.java:1415)
at android.graphics.drawable.BitmapDrawable.draw(BitmapDrawable.java:545)
at android.widget.ImageView.onDraw(ImageView.java:1268)
at android.view.View.draw(View.java:17099)
at android.view.View.updateDisplayListIfDirty(View.java:16081)
 at android.view.View.draw(View.java:16865)
at android.view.ViewGroup.drawChild(ViewGroup.java:3766)
at android.view.ViewGroup.dispatchDraw(ViewGroup.java:3552)
at android.view.View.updateDisplayListIfDirty(View.java:16076)
at android.view.View.draw(View.java:16865)
at android.view.ViewGroup.drawChild(ViewGroup.java:3766)
at android.view.ViewGroup.dispatchDraw(ViewGroup.java:3552)
at android.view.View.updateDisplayListIfDirty(View.java:16076)
at android.view.View.draw(View.java:16865)
at android.view.ViewGroup.drawChild(ViewGroup.java:3766)
at android.view.ViewGroup.dispatchDraw(ViewGroup.java:3552)
at android.view.View.updateDisplayListIfDirty(View.java:16076)
at android.view.View.draw(View.java:16865)
at android.view.ViewGroup.drawChild(ViewGroup.java:3766)
at android.view.ViewGroup.dispatchDraw(ViewGroup.java:3552)
at android.view.View.draw(View.java:17102)
at com.android.internal.policy.DecorView.draw(DecorView.java:754)
at android.view.View.updateDisplayListIfDirty(View.java:16081)
at android.view.ThreadedRenderer.updateViewTreeDisplayList(ThreadedRenderer.java:666)
at android.view.ThreadedRenderer.updateRootDisplayList(ThreadedRenderer.java:672)
at android.view.ThreadedRenderer.draw(ThreadedRenderer.java:780)
at android.view.ViewRootImpl.draw(ViewRootImpl.java:2840)
at android.view.ViewRootImpl.performDraw(ViewRootImpl.java:2648)
at android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:2255)
at android.view.ViewRootImpl.doTraversal(ViewRootImpl.java:1290)
at android.view.ViewRootImpl$TraversalRunnable.run(ViewRootImpl.java:6399)
at android.view.Choreographer$CallbackRecord.run(Choreographer.java:873)
at android.view.Choreographer.doCallbacks(Choreographer.java:685)
at android.view.Choreographer.doFrame(Choreographer.java:621)
at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:859)
at android.os.Handler.handleCallback(Handler.java:754)
at android.os.Handler.dispatchMessage(Handler.java:95)
at android.os.Looper.loop(Looper.java:165)
at android.app.ActivityThread.main(ActivityThread.java:6375)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:912)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:802)
           

看着大概意思就是,应用启动的时候,要绘制的图片太大,由于几个测试机都没问题,脑子里冒出的第一个原因应该是手机应用分配不足,立即在AndroidManifest.xml的application中添加属性:

android:largeHeap="true"

,编译运行还是不行,报错一样的,随后看了下启动页的图片,1440x3120的png图片,大小不足800kb,放置在drawable目录下,心想着这图片不至于导致这情况呀,琢磨着换个目录,放置到mipmap-xxhdpi试试,重新运行,竟一切正常了,网上查了下,有个说法:如果从项目(而不是从Web)加载图像,应该将图像放在“mipmap文件夹”中,而不是在“可绘制文件夹drawable”中,因为该图像是位图格式的,我是没怎么明白,具体什么原因不清楚,如有哪位大神知道的,烦请留言告知,万分感谢!