我每隔几天就会收到一份关于我的应用程序的崩溃报告,其中包含以下堆栈跟踪或其小变种(根据不同的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弱吗?
答案 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)。