18

私は最近、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 の会話に関するログ(「drawPatch」のドキュメント検索内)を見つけました。そこで彼は、これを引き起こしている可能性があることについて少し話し合っていますが、提案された回避策や修正はありません。このバージョンの Android でのみハードウェア アクセラレーションを無効にする必要がありますか、または回避策がある場合はどうすればよいですか?

御時間ありがとうございます。

4

4 に答える 4

9

ACはコメントでこれについて言及していますが、詳しく説明させてください。

値ファイルでブール値を作成し、正しいバージョン フォルダーに貼り付けることができます。下のマニフェストで

この投稿をチェックしてください: https://plus.google.com/+AndroidDevelopers/posts/DcsFABkyuYM .

values-v15/bools.xml をターゲットにしたいようです

http://developer.android.com/reference/android/os/Build.VERSION_CODES.html#ICE_CREAM_SANDWICH_MR1

于 2012-12-13T00:13:56.510 に答える
5

これは面白いバグで、ハードウェア アクセラレーションが機能していることが原因です (場合によっては)。ここ数日間、これに対する答えを探していました。これは ICS に記載されていますが、4.1.2 を実行している Samsung Galaxy S3 のテスト用携帯電話の 1 つで、これに気付きました。ほとんどの人は、ハードウェア アクセラレーションをオフにすることを提案しています。ハードウェア アクセラレーションによってアニメーションが非常に滑らかになるので、そうしたくありませんでした。したがって、draw() をオーバーライドしてヌル ポインター例外をキャッチすると、ハードウェア アクセラレーション機能が (ほとんどの場合) 機能し、動作していないことや例外をスローしていることに気付かないほど十分であることがわかりました。私の場合、私はカスタムビューを行っていて、カスタム描画を行う必要がありました。null の単純なチェックが機能しない (canvas==null) ため、このバグは厄介です。だから私がしたことはこれでした:

    @Override
public void draw(Canvas canvas) {
    try{
        super.draw(canvas);
        mCanvas=canvas;
    }catch(java.lang.NullPointerException e){
        Log.e("mytag","MyCustomView::draw():"+e);
    }
    if(mCanvas==null)
        return;     
...

次に、個々の draw ステートメントで NPE を黙ってキャッチします。このバグを初めて見たとき、 draw() コード全体を try and catch で囲みました。これはほとんどの電話で機能しましたが、4.1.2 を実行している samsung s3 ではちらつきが発生していました。そこで、上記の方法を使用して、someObject.draw(mCanvas) への呼び出しごとにサイレント トライ キャッチを実行したところ、すべてのちらつき (ハードウェア アクセラレーション ビュー キャッシュと新しいキャンバスの間の不一致) を完全に削除して問題を解決しました。お役に立てれば!HWA をオフにするよりもはるかに優れています。

于 2013-06-08T17:23:27.487 に答える