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

cot*_*aws 7 android zoom webview

正如在这个悬而未决的问题中提到的:WebView抛出Receiver未注册:android.widget.ZoomButtonsController

通过根据需要打开和关闭WebView缩放控件,会抛出:

java.lang.IllegalArgumentException: Receiver not registered: android.widget.ZoomButtonsController
Run Code Online (Sandbox Code Playgroud)

对于一些用户.我自己还没有看到这次崩溃,但我已经在野外设备的日志中看到了它.它不会经常发生,但无论如何都是崩溃.有任何想法吗?

谢谢

更新:如何重现

我发现了如何重现这次崩溃: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)
Run Code Online (Sandbox Code Playgroud)

和另一个类似的:

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)
Run Code Online (Sandbox Code Playgroud)

dkn*_*ler 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();
Run Code Online (Sandbox Code Playgroud)

所以我在调用WebView的destroy方法之前使用了ViewConfiguration.getZoomControlsTimeout()+ 1000L作为延迟.到目前为止没有崩溃.


小智 8

如果您只想使用缩放缩放功能处理webview,并且可以不使用缩放按钮,则可以对webview执行此操作:

webView.getSettings().setBuiltInZoomControls(true); // will give pinch zoom
webView.getSettings().setDisplayZoomControls(false); // but won't display the zoom buttons
Run Code Online (Sandbox Code Playgroud)

加入

webView.getSettings().setBuiltInZoomControls(true);
Run Code Online (Sandbox Code Playgroud)

在onDestroy/onDestroyView上没有帮助3.x.


小智 7

.webView.getSettings()setBuiltInZoomControls(真); 不适合我.

然而,dkneller的建议确实奏效了:

    long timeout = ViewConfiguration.getZoomControlsTimeout();
    new Timer().schedule(new TimerTask() {
        @Override
        public void run() {
            webview.destroy();
        }
    }, timeout);
Run Code Online (Sandbox Code Playgroud)


All*_*han 5

把这行放在onDestroy中对我有用:

webView.setVisibility(View.GONE);