android - 如何根据需要安全地打开和关闭 WebView 缩放

标签 android webview zooming

正如这个未回答的问题中提到的: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)

最佳答案

在 Zoom 上,我发现如果在调用 WebView.destroy() 之前等待缩放控件淡出,则不会再发生崩溃。所以我覆盖了 WebView.destroy() 以将消息发布到处理程序以在几秒钟后调用 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 作为延迟。到目前为止没有崩溃。

关于android - 如何根据需要安全地打开和关闭 WebView 缩放,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5267639/

相关文章:

Android WebView - Youtube 视频不在应用程序中播放

cordova - PhoneGap 捏缩放

android - 在 ViewPager 中显示 WebView

android - 如果 rs_allocation 已正确绑定(bind),是否有任何方法可以检查 RenderScrpt?

android - 以编程方式单击时突出显示 TextView

android - Android 上的快速视频压缩

使用 HTML 呈现 Android WebView

css - 放大时,为什么页脚与前面的内容重叠

ios - 缩放后在 UIScrollView 中启用分页

android - 使用 Rxjava 2 和 Retrofit 2 加载数据失败时应用程序崩溃