如何根据需要安全地打开和关闭WebView

时间:2011-03-11 00:26:07

标签: android webview zoom

正如这个悬而未决的问题所述: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)

9 个答案:

答案 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();
}