最近使用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执行即可
网友评论