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;
    }
}