【发布时间】:2012-12-12 23:09:36
【问题描述】:
我最近偶然发现了 android 4.0.3 的一个问题,我在应用程序启动后立即收到以下异常(在其他 android 版本上它工作正常):
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.ImageView.onDraw(ImageView.java:892)
at android.view.View.draw(View.java:10978)
at android.view.ViewGroup.drawChild(ViewGroup.java:2887)
at android.view.ViewGroup.dispatchDraw(ViewGroup.java:2489)
at android.view.ViewGroup.drawChild(ViewGroup.java:2885)
at android.view.ViewGroup.dispatchDraw(ViewGroup.java:2489)
at android.view.View.getDisplayList(View.java:10415)
at android.view.ViewGroup.dispatchGetDisplayList(ViewGroup.java:2597)
at android.view.View.getDisplayList(View.java:10380)
at android.view.ViewGroup.dispatchGetDisplayList(ViewGroup.java:2597)
at android.view.View.getDisplayList(View.java:10380)
at android.view.ViewGroup.dispatchGetDisplayList(ViewGroup.java:2597)
at android.view.View.getDisplayList(View.java:10380)
at android.view.ViewGroup.dispatchGetDisplayList(ViewGroup.java:2597)
at android.view.View.getDisplayList(View.java:10380)
at android.view.HardwareRenderer$GlRenderer.draw(HardwareRenderer.java:842)
at android.view.ViewRootImpl.draw(ViewRootImpl.java:1910)
at android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:1634)
at android.view.ViewRootImpl.handleMessage(ViewRootImpl.java:2442)
at android.os.Handler.dispatchMessage(Handler.java:99)
at android.os.Looper.loop(Looper.java:137)
at android.app.ActivityThread.main(ActivityThread.java:4424)
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)
这与启用硬件加速有关,只要我在清单上禁用它,应用程序就会开始正常工作。
通过搜索,我在 Romain Guy 的一些对话中找到了 log(在该文档中搜索“drawPatch”),他在其中讨论了一些可能导致此问题的原因,尽管没有解决方法或修复建议,我想知道我是否应该只为这个版本的android禁用硬件加速,或者是否有解决方法?
感谢您的宝贵时间。
【问题讨论】:
-
有一种方法可以根据 API 来disable。这是他们提供的代码:
myView.setLayerType(View.LAYER_TYPE_SOFTWARE, null);你需要一个 if 语句来检查 API 版本,然后使用上面的代码。 -
@A--C 谢谢,这需要为每个视图执行此操作,是否可以使用代码在应用程序级别更改它,我的意思是在 AndroidManifest 文件之外?
-
我不这么认为,看来您只能指定您的应用程序是硬件加速的并且它是全球性的,没有特定的 API 版本。您可以做的一件事是创建一个特殊的 API 布局文件夹(layout-v13 或任何 4.03 的 API)并在 xml 中设置每个视图的 layer 类型。
标签: android android-4.0-ice-cream-sandwich