启用硬件加速时出现NullPointerException?

11

当我点击一个简单的按钮时,我的应用程序会出现一些错误消息。点击之后应该启动一个动画,但按钮变得更大了。它在大多数设备上运行得很完美,但在某些设备上(我认为主要是4.X及以上版本)会崩溃。

异常消息(堆栈跟踪):

java.lang.NullPointerException
at android.view.GLES20RecordingCanvas.drawBitmap(GLES20RecordingCanvas.java:118)
at android.graphics.drawable.BitmapDrawable.draw(BitmapDrawable.java:400)
at android.view.View.draw(View.java:10999)
at android.view.ViewGroup.drawChild(ViewGroup.java:3186)
at android.view.ViewGroup.dispatchDraw(ViewGroup.java:2788)
at android.view.ViewGroup.drawChild(ViewGroup.java:3184)
at android.view.ViewGroup.dispatchDraw(ViewGroup.java:2788)
at android.view.ViewGroup.drawChild(ViewGroup.java:3184)
at android.view.ViewGroup.dispatchDraw(ViewGroup.java:2788)
at android.view.ViewGroup.drawChild(ViewGroup.java:3184)
at android.view.ViewGroup.dispatchDraw(ViewGroup.java:2788)
at android.view.View.draw(View.java:11017)
at android.view.View.getDisplayList(View.java:10444)
at android.view.ViewGroup.dispatchGetDisplayList(ViewGroup.java:2896)
at android.view.View.getDisplayList(View.java:10407)
at android.view.ViewGroup.dispatchGetDisplayList(ViewGroup.java:2896)
at android.view.View.getDisplayList(View.java:10407)
at android.view.ViewGroup.dispatchGetDisplayList(ViewGroup.java:2896)
at android.view.View.getDisplayList(View.java:10407)
at android.view.HardwareRenderer$GlRenderer.draw(HardwareRenderer.java:883)
at android.view.ViewRootImpl.draw(ViewRootImpl.java:2089)
at android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:1781)
at android.view.ViewRootImpl.handleMessage(ViewRootImpl.java:2666)
at android.os.Handler.dispatchMessage(Handler.java:99)
at android.os.Looper.loop(Looper.java:156)
at android.app.ActivityThread.main(ActivityThread.java:4977)
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)

提前感谢!

2个回答

2

我已经寻找这个答案好几天了。虽然ICS文档中有记录,但我在我的测试手机三星Galaxy S3上运行4.1.2版时发现了这个问题。大多数人建议关闭硬件加速,但我不想这样做,因为硬件加速使我的动画非常平滑。所以我发现,如果我覆盖draw()并捕获null指针异常,则硬件加速功能就可以工作(大多数情况下),足以让您永远不会注意到它们没有工作或抛出异常。

@Override
public void draw(Canvas canvas) {
    try{
        super.draw(canvas);
    }catch(java.lang.NullPointerException e){
        //you can log if you want to you can leave your friends behind
        //Log.e("mytag","MyCustomView::draw():"+e);
    }
}

1
因为简洁明了,我点了个赞。draw方法不运行任何应用程序代码,因此,如果您的应用逻辑抛出任何空指针异常,它们将在其他地方(例如事件等)被捕获,但绝对不会在绘制时发生。当重新绘制发生时,您的应用程序所做的很少。我猜这个方法对于您的应用程序是安全的。但是它是否对设备安全,我不知道。 - Subhas

0

我曾经遇到过这个错误,它很奇怪,但只会在非常特定的情况下发生。

我将在此描述它,以帮助任何人。

当我在启用 HW 加速的 ICS 设备上运行一个缩放动画(基本上是缩小到屏幕中间)时,它就会出现。

  • 在 ICS 上,关闭 HW 加速,它不会崩溃。
  • 在 ICS 上,启用 HW 加速,其他动画类型(增长、平移)不会崩溃。
  • 在 Jelly Bean(4.1、4.3)上(任何其他因素的组合),它不会崩溃。

我想我会为那个视图禁用 HW 加速并继续前进,这样我的应用程序的其余部分就可以顺利运行。

希望这有所帮助。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接