webview的404處理

         首先想到的是實現一個WebViewClient,監聽裏面的onreceivererror()做相應的異常處理,後面發現每次出現error之後又會有onPageStarted,onPageFinish()兩次,不會在我想要處理的onreceivererror()顯示我想要的異常頁面:

        原因可能如下(本人自己的猜測),由於webview底層的解析和webviewclient是分處在兩個不同的線程,而當webview底層解析遇到問題會去顯示android自身的錯誤界面,會走一次onPageFinish(),webviewclient會走一次OnPageStart(),,onPageFinish(),所以這個時候加載的默認界面還是webview自身的。


解決辦法如下:

@Override
    public void onPageStarted(WebView view, String url, Bitmap favicon) {
      super.onPageStarted(view, url, favicon);
      mIsLoadResource = false;
      mWapLoadingView.setVisibility(View.VISIBLE);
      mTitleView.startRefreshRotate();
      mWapLoadFailed.setVisibility(View.GONE);
    }


    @Override
    public void onPageFinished(WebView view, String url) {
      super.onPageFinished(view, url);
      mWapLoadingView.setVisibility(View.GONE);
      mTitleView.stopRefreshRotate();
      if (!mIsLoadResource) {
        mWapLoadFailed.setVisibility(View.VISIBLE);
        view.stopLoading();
      }
    }


    public void onLoadResource(WebView view, String url) {
      mIsLoadResource = true;
      super.onLoadResource(view, url);
    }


    @Override
    public void onReceivedError(WebView view, int errorCode, String description, String failingUrl) {
   
      mTitleView.stopRefreshRotate();
      if (!mIsLoadResource) {
        mWapLoadFailed.setVisibility(View.VISIBLE);
        view.stopLoading();
      }
      super.onReceivedError(view, errorCode, description, failingUrl);
    }


    @Override
    public void onReceivedSslError(WebView view, SslErrorHandler handler, SslError error) {
      handler.proceed();// 接受證書
      mTitleView.stopRefreshRotate();
      if (!mIsLoadResource) {
        mWapLoadFailed.setVisibility(View.VISIBLE);
        view.stopLoading();
      }
    }


t通過OnLoadResource的回調來應對錯誤的情況,由於webview自身加載本機的默認失敗頁面是不會調用onloadresource的那麼就可以通過onloadresource來作爲是否是加載失敗的標誌,從而對錯誤做相應的處理

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章