6

数日ごとに、次のスタックトレース、またはその小さなバリアント(さまざまなAndroidバージョンに基づいてさまざまな行番号を持つ)を含むアプリケーションのクラッシュレポートを受け取ります

java.lang.NullPointerException at
WebView.java:8241:in `android.webkit.WebView$PrivateHandler.handleMessage'
Handler.java:99:in `android.os.Handler.dispatchMessage'
Looper.java:150:in `android.os.Looper.loop'
ActivityThread.java:4293:in `android.app.ActivityThread.main'
Method.java:-2:in `java.lang.reflect.Method.invokeNative'
Method.java:507:in `java.lang.reflect.Method.invoke'
ZygoteInit.java:849:in `com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run'
ZygoteInit.java:607:in `com.android.internal.os.ZygoteInit.main'
NativeStart.java:-2:in `dalvik.system.NativeStart.main'

この特定のスタックは、HTC EVO3DPG86100デバイスのAndroid2.3.4にありました。私のアプリは、いくつかのoAuth関連のログインシナリオでいくつかのWebビューをホストします。

これを修正する方法を理解するにはどうすればよいですか?grepcodeを調べてソースを見つけようとしましたが、意味のある一致する行番号を見つけることができません。私のGrepcode-fuは弱いですか?

4

1 に答える 1

5

私は最近この問題に遭遇しました、そして私の場合、私は二次的なバグ修正がこの問題を引き起こしていることをなんとか理解することができました。

したがって、webviewを拡張するカスタムクラスを作成しなかった場合、このandroidバグレポートの提案により、onCheckIsTextEditorをオーバーライドして常にtrueを返します...ここで読むのをやめます。

それを行った場合、この修正はHTCによってすでに実装されているようであり、何らかの理由でフォーカスを受け取ったときにクラッシュします。この問題は、ビューにタッチイベントを配置するときと、ビューの可視性を設定するときの2つの場所で明らかになりました。私のプロジェクトでは、WebViewClientを設定し、ページの読み込みが完了するまで待ってから、Webビューの可視性を表示に設定しました。これにより、次のスタックトレースが発生しました。

java.lang.NullPointerException at android.webkit.WebView.navHandledKey(WebView.java:9353)
    at android.webkit.WebView.requestFocus(WebView.java:7910)
    at android.view.View.requestFocus(View.java:3718)
    at android.view.View.requestFocus(View.java:3696)
    at android.view.ViewRoot.focusableViewAvailable(ViewRoot.java:1803)
    at android.view.ViewGroup.focusableViewAvailable(ViewGroup.java:474)
    at android.view.ViewGroup.focusableViewAvailable(ViewGroup.java:474)
    at android.view.ViewGroup.focusableViewAvailable(ViewGroup.java:474)
    at android.view.ViewGroup.focusableViewAvailable(ViewGroup.java:474)
    at android.view.ViewGroup.focusableViewAvailable(ViewGroup.java:474)
    at android.view.ViewGroup.focusableViewAvailable(ViewGroup.java:474)
    at android.view.View.setFlags(View.java:4680)
    at android.view.View.setVisibility(View.java:3163)

setVisibility呼び出しをtry/catchでラップすることにより、タッチイベントをオーバーライドする必要があるかどうかを判断できました。イベントをキャッチした場合、それはオーバーライドを無効にする必要があることを意味します。これは私がしたことの例です:

try {
    webView.setVisibility(View.VISIBLE);
} catch (NullPointerException e) {
    Log.i(TAG, "Error setting webview visibility due to overriding focus. It will be disabled.");
    webView.setOverrideOnCheckIsTextEditor(false);
    // Confirm window is visible
    webView.setVisibility(View.VISIBLE);
}

私のカスタムWebビューは次のようになり、最後の2つの方法に特別な注意が払われました。

/**
 * When using a webview in a dialog, there are issues relating to the keyboard not appearing when focusing on a text box.
 * This overrides a function to ensure the keyboard is shown when focusing on a text box in a webview.
 * See link for bug report and solution.
 *
 * @see http://code.google.com/p/android/issues/detail?id=7189
 * @see http://stackoverflow.com/questions/12325720
 * @author James O'Brien
 * @since 10/16/2012
 */
public class FocusableWebView extends WebView {

    private boolean mOverrideCheckIsTextEditor = true;

    /**
     * Default Constructor
     *
     * @param context
     */
    public FocusableWebView(Context context) {
        super(context);
    }

    /**
     * Default Constructor
     *
     * @param context
     * @param attrs
     */
    public FocusableWebView(Context context, AttributeSet attrs) {
        super(context, attrs);
    }

    /**
     * Default Constructor
     *
     * @param context
     * @param attrs
     * @param defStyle
     */
    public FocusableWebView(Context context, AttributeSet attrs, int defStyle) {
        super(context, attrs, defStyle);
    }

    @Override
    public boolean onCheckIsTextEditor() {
        if (mOverrideCheckIsTextEditor) {
            return true;
        } else {
            return super.onCheckIsTextEditor();
        }
    }

    /**
     * Enable/Disable overriding of onCheckIsTextEditor to always return true.
     */
    public void setOverrideOnCheckIsTextEditor(boolean foo) {
        mOverrideCheckIsTextEditor = foo;
    }
}

申し訳ありませんが、これで問題が解決する理由について詳しく説明することはできません。私が推測できるのは、フォーカスに関連し、動的に無効にすることでうまくいくと思います:)

**更新(12/11/12)**

上記の両方の問題を解決することができました。これは、Webビューの焦点に関する問題のようでした。私のコードは次のようになります

webView.setVisibility(View.VISIBLE);
webView.setFocusable(true);
webView.requestFocus();

focusable属性を明示的に「true」に設定するか、setFocusable(true)を呼び出すことをお勧めします。

于 2012-10-16T22:25:39.127 に答える