【问题标题】:How to safely turn WebView zooming on and off as needed如何根据需要安全地打开和关闭 WebView 缩放
【发布时间】:2011-07-13 03:56:07
【问题描述】:

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

【问题讨论】:

  • 我可以拥有完整的崩溃堆栈@littleFluffyKitty 吗?
  • @Reno 哦,嘿!你肯定能骗到它!
  • @the100rabh,现在我只是在需要时通过将 getSettings().setBuiltInZoomControls() 设置为 true 或 false 来打开和关闭它。然而,在野外,它似乎会产生上述崩溃(不是非常频繁,但经常足以想要找到不同的方法)

标签: android webview zooming


【解决方案1】:

在 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 作为延迟。到目前为止没有崩溃。

【讨论】:

    【解决方案2】:

    将此添加到您的活动中:

    @Override
      public void finish() {
          ViewGroup view = (ViewGroup) getWindow().getDecorView();
          view.removeAllViews();
          super.finish();
    }
    

    【讨论】:

      【解决方案3】:

      此解决方案效果很好,您只需在销毁之前从布局中删除 webview:

      @Override
          public void onDestroy() {
              if (webView!=null && webView.getParent()!=null){
                  ((ViewGroup)webView.getParent()).removeView(webView);
                  webView.destroy();
                  webView=null;
              }
              super.onDestroy();
          }
      

      没有处理程序,没有延迟,我认为这是最好的解决方案

      【讨论】:

        【解决方案4】:

        将这一行放入 onDestroy 对我有用:

        webView.setVisibility(View.GONE);

        【讨论】:

          【解决方案5】:

          webView.getSettings().setBuiltInZoomControls(true);对我不起作用。

          dkneller 的建议确实奏效了,但是:

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

          【讨论】:

          • 我在某些设备中崩溃了(4.X 5.X 6.X 所有报告),上面的答案,java.lang.Throwable:在线程'Timer-上调用了 WebView 方法0'。所有 WebView 方法必须在同一个线程上调用。 (预期 Looper Looper (main, tid 1) {4240c348} 在 null 上调用,仅供参考,主要 Looper 是 Looper (main, tid 1)
          【解决方案6】:

          如果您只想让缩放缩放与您的 web 视图一起使用,并且您可以在没有缩放按钮的情况下生活,您可以对您的 web 视图执行此操作:

          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 没有帮助。

          【讨论】:

            【解决方案7】:

            如果您遇到这个问题,请务必先查看错误报告以查看 Google 提供的状态,否则这里有一个解决方法,到目前为止对我来说非常有用:

            将此行添加到您的 onDestory() 方法中:

            webView.getSettings().setBuiltInZoomControls(true);
            

            【讨论】:

            • 此修复不能完全解决问题。试试 dkneller 的方法。
            【解决方案8】:

            java.lang.IllegalArgumentException: View not attach to window manager 异常主要发生在有对话框(即进度对话框)并且您在 Activity 关闭时关闭它时。您能否判断您的活动中是否确实有一个进度对话框,以便我继续分析? 同时发布您的 Activity 代码 sn-p 这可能有助于我们确定您的应用崩溃的原因...

            另外你说你不会经常遇到应用程序崩溃,所以做一个测试来证实我的怀疑。当您的应用程序正在运行时,请更改您的屏幕方向,并在几分钟后执行几次,最好是在执行某些工作时涉及 Progress Dialog。它可能会使应用程序崩溃,这应该告诉我们错误是因为进度对话框没有正确关闭。

            我的理论:当您切换方向时,Android 将创建一个新视图。您可能会崩溃,因为您的后台线程正在尝试更改旧线程的状态。 (也可能因为您的后台线程不在 UI 线程上而出现问题)

            【讨论】:

            • 我想你解释一下 WindowBadToken Exception。但这是不同的情况
            【解决方案9】:

            我也有同样的问题:Existent app blowing up with android 3.0 XOOM. ZoomButtonsController Leak?

            如果在调用 registerReceiver 之前发生异常,然后您稍后尝试取消 registerReceiver 而未注册它,则会发生这种情况。

            这可能是 android 3.0 的错误。

            【讨论】:

            • 查看错误日志,我发现 3.0 之前的设备也发生了这种情况。
            • 根据this 可能固定在蜂窝o_O"
            猜你喜欢
            • 2022-12-07
            • 2011-04-15
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2017-12-07
            • 2022-08-22
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多