android - 有没有办法只为 android 4.0.3 禁用硬件加速?

标签 android android-4.0-ice-cream-sandwich

我最近偶然发现了 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)

这与启用硬件加速有关,只要我在 list 上禁用它,应用程序就会开始正常工作。

通过搜索,我找到了 log (在该文档中搜索“drawPatch”)在 Romain Guy 的一些对话中,他讨论了一些可能导致这种情况的原因,尽管没有提出解决方法或修复建议,我想知道我是否应该只为此禁用硬件加速android 版本,或者是否有解决方法?

感谢您的宝贵时间。

最佳答案

您目前无法通过代码在窗口级别禁用硬件加速。

只启用它。我建议您在 list 中默认禁用它:

<application android:hardwareAccelerated="false">
    <activity ... />
    <activity android:hardwareAccelerated="false" />
</application>

然后将其启用到所有其他版本:

if (Build.VERSION.SDK_INT != Build.VERSION_CODES.ICE_CREAM_SANDWICH_MR1) {
            getWindow().setFlags(
                    WindowManager.LayoutParams.FLAG_HARDWARE_ACCELERATED,
                    WindowManager.LayoutParams.FLAG_HARDWARE_ACCELERATED);
        }

您可以使用以下代码在运行时为单个 View 禁用硬件加速:

myView.setLayerType(View.LAYER_TYPE_SOFTWARE, null);

此信息可在 Android - Controlling Hardware Acceleration 中找到

关于android - 有没有办法只为 android 4.0.3 禁用硬件加速?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13850259/

相关文章:

java - WebView 进度条仅在页面加载时第一次显示。每次都如何设置?

java - 如何访问firebase数组

android - Android4.0及之前版本UDP发送

android - ICS 上的 native 堆栈跟踪?

android - 在 Android 运行时设置 Actionbar 覆盖模式

java - 在Android中安排JobIntentService

android - 如何在 android 中查找第三方应用程序内容提供商 URI?

安卓 ICS : Problems to get the server certificate of the HttpsUrlConnection

android - 有官方的Android section View吗?

android - Match_parent 属性的用途