Notice WebView - litonghui/TechBlog GitHub Wiki
最近在WebView 开发中遇到一些小细节问题,记录一下,方便以后避免类似问题:
1. 通过WebChromeClient 的onProgressChanged()设置progress,当newProgress==100或者onPageFinished()以后调用隐藏loading。但是遇到了一个问题,webview已经成功加载并且渲染成功,但是此时newProgress并不为100,也未成功回调onPageFinished()在过几秒之后才调用。这样造成的现象很显而易见webview加载出来的网页上有一个loading动画图。尴尬!!!
public void onProgressChanged(WebView view, int newProgress) {} //显示更新加载进度
public void onPageFinished(WebView view, String url)// 页面加载完成
解决方案:LoadingView layout match_parent全部盖住这个页面 ,等onPageFinished()回调时候再invisible,不至于网页上出现loading动画图
<FrameLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="#ffffff">
<com.androidtool.home.branch.webview.HWebView
android:id="@+id/webview"
android:layout_width="match_parent"
android:layout_height="match_parent"/>
<com.androidtool.view.LoadingView
android:id="@+id/loadingView"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:gravity="center"
android:visibility="invisible"/>
</FrameLayout>
2. WebView的goback()方法bug。参考1、参考2
1)Android webview goback not refresh , 造成标题无发更新,例如:
mWebView.setWebChromeClient(new WebChromeClient() {
@Override
public void onReceivedTitle(WebView view, String title) {
super.onReceivedTitle(view, title);
if (!TextUtils.isEmpty(title)) {
mTitle.setText(title);
} else {
mTitle.setText("返回");
}
}
});
在个别手机不同系统点击back键调用goback() 却不能刷新,造成onReceivedTitle() 无发回调,解决办法:
mWebView.setWebViewClient(new WebViewClient() {
@Override
public void onPageFinished(WebView view, String url) {
super.onPageFinished(view, url);
try {
String title = view.getTitle();
if (!TextUtils.isEmpty(title)) {
mTitle.setText(title);
} else {
mTitle.setText("返回");
}
} catch (Exception e) {
}
}
}
特别注意view.getTitle();方法在魅族4手机上,拿到的是整个网址,对于这种行为我们只能遇坑添坑,if (!TextUtils.isEmpty(title) && !title.contains("http"))。
1)Android webview loadUrl(mUrl) 与 goback() 冲突,简单解释遇到问题:客户端在开发加载H5 页面时候做了一个加载失败重试机制,在断网或者其他情况下加载H5失败会自定义按钮点击重试,调用mWebView.loadUrl(mUrl)方法,当然下次失败之后也可以点击调用该方法,在小米4手机上出现一个问题,连续点击n次之后,点击back键调用goback() 方法,需要点击n次back键才能推出,意味着失败的加载也被扔进加载队列中,着实不解。
mLoadView.setReloadDataListener(new ReloadDataListener() {
@Override
public void onReloadData() {
mWebView.loadUrl(mUrl);//点击N次
}
});
@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
if ((keyCode == KeyEvent.KEYCODE_BACK) && mWebView.canGoBack()) {
mWebView.goBack();//返回N次
return true;
}
return super.onKeyDown(keyCode, event);
}
解决方案,在每次重试前可以mWebView.clearHistory();清空失败队列。同时加个标记,onReceivedError 方法标记未true,在onKeyDown 方法中 &&mError使用。
3. Activity 加载WebView 播放视频,在部分手机点击back()键之后发现视频还在播放,点击第二个视频,出现双频道播放,调研解决方案如下,其中autoPause():
@Override
protected void onPause() {
super.onPause();
autoPause()
}
@Override
protected void onDestroy() {
super.onDestroy();
if(mWebView!=null) {
mWebView.removeAllViews();
mWebView.destroy();
mWebView = null;
}
}