webview.java中的NullPointerException(android.webkit.WebView $ PrivateHandler.handleMessage)

时间:2012-09-07 21:35:33

标签: android webview htc-android

我每隔几天就会收到一份关于我的应用程序的崩溃报告,其中包含以下堆栈跟踪或其小变种(根据不同的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 EVO 3D PG86100设备的Android 2.3.4上。 我的应用程序为一些与oAuth相关的登录方案提供了几个webview。

我应该怎样去弄清楚如何解决这个问题?我已经尝试查找grepcode来查找源代码,但我无法找到有意义的匹配行号。我的Grepcode-fu弱吗?

1 个答案:

答案 0 :(得分:5)

我最近遇到了这个问题,在我的情况下,我设法找出导致此问题的辅助错误修复。

所以,如果你没有创建一个扩展webview的自定义类,那么由于这个android bug report中的建议,覆盖onCheckIsTextEditor总是返回true ...我会在这里停止阅读。

如果您已经这样做了,那么HTC已经实现了此修复,并且由于某种原因导致它在获得焦点时崩溃。当在视图上放置触摸事件并设置视图可见性时,这个问题在我的两个地方表现出来。在我的项目中,我设置了一个WebViewClient并等待页面完成加载,然后将webview的可见性设置为可见。这导致了以下堆栈跟踪:

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)

通过在try / catch中包装setVisibility调用,我能够确定是否应该覆盖触摸事件。如果我抓住了这个事件,那就意味着我应该禁用覆盖。这是我所做的一个例子:

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);
}

我的自定义webview现在看起来像这样,特别关注最后两种方法:

/**
 * 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焦点的一个问题。我的代码现在看起来像这样

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

我建议您确保将focusable属性显式设置为'true'或调用setFocusable(true)。