正如这个悬而未决的问题所述:WebView throws Receiver not registered: android.widget.ZoomButtonsController
根据需要打开和关闭WebView缩放控件会抛出:
java.lang.IllegalArgumentException: Receiver not registered: android.widget.ZoomButtonsController
对于某些用户。我自己还没有看到这次崩溃,但我已经在野外设备的日志中看到了它。它不会经常发生,但无论如何都是崩溃。有什么想法吗?
由于
更新:如何重现
我找到了如何重现这次崩溃:http://code.google.com/p/android/issues/detail?id=15694
如果发现解决方法,我会报告。
根据要求,完整堆栈跟踪:
java.lang.IllegalArgumentException: Receiver not registered: android.widget.ZoomButtonsController$1@487a4290
at android.app.ActivityThread$PackageInfo.forgetReceiverDispatcher(ActivityThread.java:793)
at android.app.ContextImpl.unregisterReceiver(ContextImpl.java:913)
at android.content.ContextWrapper.unregisterReceiver(ContextWrapper.java:331)
at android.widget.ZoomButtonsController.setVisible(ZoomButtonsController.java:404)
at android.widget.ZoomButtonsController$2.handleMessage(ZoomButtonsController.java:178)
at android.os.Handler.dispatchMessage(Handler.java:99)
at android.os.Looper.loop(Looper.java:123)
at android.app.ActivityThread.main(ActivityThread.java:4627)
at java.lang.reflect.Method.invokeNative(Native Method)
at java.lang.reflect.Method.invoke(Method.java:521)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:858)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616)
at dalvik.system.NativeStart.main(Native Method)
和另一个类似的人:
java.lang.IllegalArgumentException: View not attached to window manager
at android.view.WindowManagerImpl.findViewLocked(WindowManagerImpl.java:391)
at android.view.WindowManagerImpl.removeView(WindowManagerImpl.java:236)
at android.view.Window$LocalWindowManager.removeView(Window.java:432)
at android.widget.ZoomButtonsController.setVisible(ZoomButtonsController.java:406)
at android.widget.ZoomButtonsController$2.handleMessage(ZoomButtonsController.java:178)
at android.os.Handler.dispatchMessage(Handler.java:99)
at android.os.Looper.loop(Looper.java:143)
at android.app.ActivityThread.main(ActivityThread.java:5068)
at java.lang.reflect.Method.invokeNative(Native Method)
at java.lang.reflect.Method.invoke(Method.java:521)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:868)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:626)
at dalvik.system.NativeStart.main(Native Method)
答案 0 :(得分:10)
在Xoom上,我发现如果在调用WebView.destroy()之前等待缩放控件淡出,则不再发生崩溃。所以我已经覆盖了WebView.destroy()以在几秒钟后向Handler发布消息以调用WebView.destroy()。从WebView源我们看到淡出间隔是:
// The time that the Zoom Controls are visible before fading away
private static final long ZOOM_CONTROLS_TIMEOUT =
ViewConfiguration.getZoomControlsTimeout();
所以我在调用WebView的destroy方法之前使用了ViewConfiguration.getZoomControlsTimeout()+ 1000L作为延迟。到目前为止没有崩溃。
答案 1 :(得分:8)
如果您只想使用缩放缩放功能处理webview,并且可以在没有缩放按钮的情况下使用,则可以对webview执行此操作:
webView.getSettings().setBuiltInZoomControls(true); // will give pinch zoom
webView.getSettings().setDisplayZoomControls(false); // but won't display the zoom buttons
添加
webView.getSettings().setBuiltInZoomControls(true);
onDestroy / onDestroyView中的对3.x没有帮助。
答案 2 :(得分:7)
webView.getSettings()setBuiltInZoomControls(真)。不适合我。
然而,dkneller的建议确实奏效了: long timeout = ViewConfiguration.getZoomControlsTimeout();
new Timer().schedule(new TimerTask() {
@Override
public void run() {
webview.destroy();
}
}, timeout);
答案 3 :(得分:5)
把这行放在onDestroy上对我有用:
webView.setVisibility(View.GONE);
答案 4 :(得分:3)
此解决方案工作正常,您只需要在销毁之前从布局中删除webview:
@Override
public void onDestroy() {
if (webView!=null && webView.getParent()!=null){
((ViewGroup)webView.getParent()).removeView(webView);
webView.destroy();
webView=null;
}
super.onDestroy();
}
没有处理程序,没有延迟,我认为这是最好的解决方案
答案 5 :(得分:2)
如果您遇到这个问题,请务必首先查看错误报告以了解Google的状态,但是此处的解决方法对我来说非常有用:
将此行添加到onDestory()方法:
webView.getSettings().setBuiltInZoomControls(true);
答案 6 :(得分:0)
java.lang.IllegalArgumentException:视图未附加到窗口管理器异常主要发生在有对话框(即进度对话框)并且您在活动关闭时将其解除时。你能告诉你的Activity是否确实有一个Progress Dialog,这样我可以继续我的分析吗? 同时发布您的Activity的代码段,这可能有助于我们确定您的应用崩溃的原因......
另外,您说您经常不会面临应用程序崩溃,因此请进行测试以确认我的怀疑。当您的应用程序运行时,请更改您的屏幕方向,并在几分钟后执行几次,最好是在执行某些工作时参与进度对话框。它可能会崩溃应用程序,它应该告诉我们错误是因为进度对话框没有正确解除。
我的理论:当你切换方向时,Android会创建一个新视图。您可能正在崩溃,因为您的后台线程正在尝试更改旧的状态。 (它可能也有问题,因为你的后台线程不在UI线程上)
答案 7 :(得分:0)
我在这里遇到同样的问题:Existent app blowing up with android 3.0 XOOM. ZoomButtonsController Leak?
如果在调用registerReceiver之前发生异常,然后您尝试取消注册会话而没有注册它,则会发生这种情况。
这可能是一个android 3.0错误。
答案 8 :(得分:0)
将此添加到您的活动中:
@Override
public void finish() {
ViewGroup view = (ViewGroup) getWindow().getDecorView();
view.removeAllViews();
super.finish();
}