首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >webview.java (android.webkit.WebView$PrivateHandler.handleMessage)中的NullPointerException

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

Stack Overflow用户
提问于 2012-09-08 05:35:33
回答 1查看 3.5K关注 0票数 6

每隔几天我就会收到我的应用程序的崩溃报告,其中包含以下堆栈跟踪或其小变体(基于不同的android版本,具有不同的行号)

代码语言:javascript
复制
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设备上的Android2.3.4上实现的。我的应用程序为一些与oAuth相关的登录场景托管了几个does视图。

我应该如何开始尝试解决这个问题呢?我尝试在grepcode上查找源代码,但我无法找到有意义的匹配行号。我的Grepcode-fu是不是很弱?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2012-10-17 06:25:39

我最近遇到了这个问题,在我的案例中,我设法找出了第二个bug修复导致了这个问题。

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

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

代码语言:javascript
复制
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中,我能够确定是否应该覆盖触摸事件。如果我发现了这个事件,那就意味着我应该关闭超驰装置。这是我所做的一个例子:

代码语言:javascript
复制
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现在看起来像这样,特别注意最后两个方法:

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

代码语言:javascript
复制
webView.setVisibility(View.VISIBLE);
webView.setFocusable(true);
webView.requestFocus();

我建议您确保将可聚焦属性显式设置为“true”或调用setFocusable(true)。

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/12325720

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档