2012-09-07 2 views
6

数日おきに私のアプリケーションのクラッシュレポートを以下のスタックトレース、またはその小さな変形(さまざまなアンドロイドバージョン)

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 EVO 3D PG86100デバイスのAndroid 2.3.4に搭載されています。 私のアプリは、いくつかのoAuth関連のログインシナリオでいくつかのwebviewsをホストしています。

これを修正する方法を把握するにはどうすればよいですか?私はソースを見つけるためにgrepcodeを探してみましたが、合った行番号を見つけることができません。私のGrepcode-fuは弱いですか?

+0

Androidのリリースまたはデバイスメーカーのパターンはありますか? – CommonsWare

+0

面白い観察!それはHTCデバイスに限定されているようです! – PacificSky

+0

HTCタグを追加しました。これは、HTCの支援を受ける可能性があるためです。私は再現可能なテストケースを持っていないと仮定します - 正しい? – CommonsWare

答えて

5

私は最近この問題に遭遇しましたが、私の場合、第2のバグ修正がこの問題を引き起こしていることがわかりました。

webviewを拡張するカスタムクラスを作成しなかった場合は、このandroid bug reportの提案のためにonCheckIsTextEditorが常にtrueを返すようにオーバーライドされます...ここでは読まなくなります。

これを実行すると、HTCによってこの修正が既に実装されているように見え、何らかの原因でフォーカスを受けたときにクラッシュするように見えます。この問題は、ビューにタッチイベントを配置し、ビューの可視性を設定することで、私にとって2つの場所に現れました。私のプロジェクトでは、WebViewClientを設定して、ページがロード完了するまで待ってから、webviewの可視性を可視に設定しました。私はタッチイベントを上書きするかべきではないかどうかを判断することができたのtry/catchでsetVisibility呼び出しをラップすることによって

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) 

:これは、次のスタックトレースを引き起こしました。私がイベントをキャッチした場合、それは無効にする必要があります。これは私がやったことの一例です:

マイカスタムWebViewが次のようになります
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); 
} 

、最後の二つの方法に支払わ特別な注意:私はについて詳細に行くことができない

/** 
* 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)**

は、上記の両方の問題を解決するために管理。それはwebviewの焦点に問題があるようでした。私のコードは、今私はあなたが明示的に「真」またはsetFocusableを呼び出す(真)にフォーカス可能な属性を設定することを確認することを示唆している。この

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

のように見えます。

+0

で発生します。修正内容は、元の質問とは少し異なる問題です。あなたが見ているクラッシュをnavHandledKeyで見たので、あなたの修正によってクラッシュが修正されるかもしれません。しかし、私は私が(PrivateHandler.handleMessageでクラッシュ)投稿した元のスタックトレースを修正するのか分からない。あなたのアプリでそのクラッシュを見たことが確認できますか?それは修正後に消えてしまっていますか? – PacificSky

+0

私は、同様のHTCバージョン対応電話機で同じスタックトレースを取得していましたが、フォーカスオーバーライドをオフにすると問題が解決しました。私は理解し、2番目の段落で、私の修正はかなり具体的であることに気づいたが、私はそれがウェブビューに関連していたことを指摘したいと思っています。 – jimmithy

+0

ありがとうございます。私はあなたの修正を実装しました。同じクラッシュが再現されない場合は、それを答えとしてマークします! – PacificSky

関連する問題