X5WebViewAndroid技术知识

android webview ZoomButtonsContr

2017-06-20  本文已影响926人  kecai

最近使用Cordova中 的webview会出现以下报错:
E/AndroidRuntime(13332): Java.lang.IllegalArgumentException: Receiver not registered: Android.widget.ZoomButtonsController$1@4162fc18

根据异常信息再参考一下WebView的源码就可以知道ZoomButtonsController有一个register和unregister的过程。但是这两个过程是我们控制不了的,WebView有显示控制的API但我们访问不过。

很多网上的回答都是在Activity的onDestroy里面加上这么一句:web.setVisibility(View.GONE);把WebView设置为GONE就可以了。

但是还是会报这样的错误。仔细研究会发现:webview的 ZoomButton的自动隐藏是一个渐变的过程,所以在逐渐消失的过程中如果调用了父容器的destroy方法,就会导致Leaked。
所以要延迟1s再destroy:
if(null!=this.appView) {
if (null != this.appView.getView()) {
((WebView) this.appView.getView()).getSettings().setBuiltInZoomControls(true);

            this.appView.getView().setVisibility(View.GONE);
            long  timeout

=ViewConfiguration.getZoomControlsTimeout();

            new Timer().schedule(new TimerTask(){
                @Override
                public void run() {
                    try {
                    ((WebView)appView.getView()).destroy();
                    }catch (Exception e){

                    }
                }
            }, timeout+1000L);
        }
    }

一般到这里就会结束了。但是我在CordovaActivity中应用会发现还是没用。那么我们看下是不是在父类中的ondestroy方法里提前把webview设置为GONE。
果不其然:
@Override
public void onDestroy() {
LOG.d(TAG, "CordovaActivity.onDestroy()");
super.onDestroy();

    if (this.appView != null) {
        appView.handleDestroy();
    }
}

那么我们把这段:
if (this.appView != null) {
appView.handleDestroy();
}

注释掉,移到外面延迟1s执行即可

上一篇下一篇

猜你喜欢

热点阅读