每隔几天我就会收到我的应用程序的崩溃报告,其中包含以下堆栈跟踪或其小变体(基于不同的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设备上的Android2.3.4上实现的。我的应用程序为一些与oAuth相关的登录场景托管了几个does视图。
我应该如何开始尝试解决这个问题呢?我尝试在grepcode上查找源代码,但我无法找到有意义的匹配行号。我的Grepcode-fu是不是很弱?
发布于 2012-10-17 06:25:39
我最近遇到了这个问题,在我的案例中,我设法找出了第二个bug修复导致了这个问题。
所以,如果你没有创建一个扩展webview的自定义类,由于这个android bug report中的建议,它会覆盖onCheckIsTextEditor以始终返回true……我会在这里停止阅读。
如果你已经这样做了,那么似乎HTC已经实现了这个修复,并且由于某种原因导致它在接收到焦点时崩溃。对我来说,这个问题表现在两个地方,一是在视图上放置触摸事件,二是设置视图的可见性。在我的项目中,我设置了一个WebViewClient,并等到页面加载完成后,才将webview的可见性设置为visible。这导致了以下堆栈跟踪:
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);
}我的自定义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();我建议您确保将可聚焦属性显式设置为“true”或调用setFocusable(true)。
https://stackoverflow.com/questions/12325720
复制相似问题