如何解决NullPointerException in android.view.GLES20RecordingCanvas

一、如何解决NullPointerException in android.view.GLES20RecordingCanvas

在发布版本的最后一轮过设备时,在某老旧设备上出现了空指针异常
java.lang.NullPointerException
at android.view.GLES20RecordingCanvas.drawPatch(GLES20RecordingCanvas.java:97)
at android.graphics.NinePatch.draw(NinePatch.java:125)
at android.graphics.drawable.NinePatchDrawable.draw(NinePatchDrawable.java:189)
at android.widget.ScrollBarDrawable.drawThumb(ScrollBarDrawable.java:178)
at android.widget.ScrollBarDrawable.draw(ScrollBarDrawable.java:137)
at android.view.View.onDrawVerticalScrollBar(View.java:9532)
at android.view.View.onDrawScrollBars(View.java:9476)
at android.view.View.draw(View.java:11091)
at android.widget.AbsListView.draw(AbsListView.java:3428)
at android.view.View.getDisplayList(View.java:10455)
at android.view.ViewGroup.dispatchGetDisplayList(ViewGroup.java:2605)
at android.view.View.getDisplayList(View.java:10418)
at android.view.ViewGroup.dispatchGetDisplayList(ViewGroup.java:2605)
at android.view.View.getDisplayList(View.java:10418)
at android.view.ViewGroup.drawChild(ViewGroup.java:2858)
at android.view.ViewGroup.dispatchDraw(ViewGroup.java:2497)
at android.view.View.draw(View.java:11067)
at android.view.View.getDisplayList(View.java:10455)
at android.view.ViewGroup.dispatchGetDisplayList(ViewGroup.java:2605)
at android.view.View.getDisplayList(View.java:10418)
at android.view.ViewGroup.dispatchGetDisplayList(ViewGroup.java:2605)
at android.view.View.getDisplayList(View.java:10418)
at android.view.ViewGroup.dispatchGetDisplayList(ViewGroup.java:2605)
at android.view.View.getDisplayList(View.java:10418)
at android.view.ViewGroup.dispatchGetDisplayList(ViewGroup.java:2605)
at android.view.View.getDisplayList(View.java:10418)
at android.view.ViewGroup.dispatchGetDisplayList(ViewGroup.java:2605)
at android.view.View.getDisplayList(View.java:10418)
at android.view.ViewGroup.dispatchGetDisplayList(ViewGroup.java:2605)
at android.view.View.getDisplayList(View.java:10418)
at android.view.HardwareRenderer$GlRenderer.draw(HardwareRenderer.java:879)
at android.view.ViewRootImpl.draw(ViewRootImpl.java:1955)
at android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:1661)
at android.view.ViewRootImpl.handleMessage(ViewRootImpl.java:2505)
at android.os.Handler.dispatchMessage(Handler.java:99)
at android.os.Looper.loop(Looper.java:154)
at android.app.ActivityThread.main(ActivityThread.java:4945)
at java.lang.reflect.Method.invokeNative(Native Method)
at java.lang.reflect.Method.invoke(Method.java:511)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:784)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:551)
at dalvik.system.NativeStart.main(Native Method)
开始出现闪退时觉得很惊讶,抓了日志马上谷歌。发现原来是android 4.0.X对不支持.9图片硬件加速,而从android4.0.x(SDK 14)开始系统默认打开硬件加速。
解决方法:view取消硬件加速
myView.setLayerType(View.LAYER_TYPE_SOFTWARE, null);

二、扩展阅读

在自定义控件或者自定义绘画时,应该注意使用的api是否支持硬件加速,以避免出现闪退情况
            
  First supported API level         
Canvas      
drawBitmapMesh() (colors array) 18         
drawPicture() 23         
drawPosText() 16         
drawTextOnPath() 16         
drawVertices()         
setDrawFilter() 16         
clipPath() 18         
clipRegion() 18         
clipRect(Region.Op.XOR) 18         
clipRect(Region.Op.Difference) 18         
clipRect(Region.Op.ReverseDifference) 18         
clipRect() with rotation/perspective 18         
Paint          
setAntiAlias() (for text) 18         
setAntiAlias() (for lines) 16         
setFilterBitmap() 17         
setLinearText()         
setMaskFilter()         
setPathEffect() (for lines)         
setRasterizer()         
setShadowLayer() (other than text)         
setStrokeCap() (for lines) 18         
setStrokeCap() (for points) 19         
setSubpixelText()         
Xfermode          
PorterDuff.Mode.DARKEN (framebuffer)         
PorterDuff.Mode.LIGHTEN (framebuffer)         
PorterDuff.Mode.OVERLAY (framebuffer)         
Shader          
ComposeShader inside ComposeShader         
Same type shaders inside ComposeShader         
Local matrix on ComposeShader 18         

画布Canvas的scale方法
   
Drawing operation to be scaled First supported API level
drawText() 18
drawPosText()
drawTextOnPath()
Simple Shapes* 17
Complex Shapes*
drawPath()
Shadow layer
关注最新api请移步官网链接

https://developer.android.com/guide/topics/graphics/hardware-accel.html


说明:因为实际的错误堆栈会知道本人开发的实际项目,所以本博客的错误堆栈使用StackoverFlow问题中的内容。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值