当发生某些错误(Internet断开连接,超时...)并且failingUrl保存在viewModel中时,会在webview中加载自定义html页面。
当按下重新加载按钮时,它将尝试重新加载failingUrl。


问题是每次我加载自定义html文件时,都会在onPageStarted中再次调用该文件,并清除failingUrl。因此failingUrl将为null。调用onPageStarted时,如何知道它是否是错误页面?

webView.setWebViewClient(new WebViewClient() {
        @Override
        public void onPageStarted(WebView view, String url, Bitmap favicon) {
            super.onPageStarted(view, url, favicon);
            //clear failingUrl
            viewModel.setFailingUrl(null);
        }

        @Override
        public void onPageFinished(WebView view, String url) {
            super.onPageFinished(view, url);

        }

        @Override
        public void onReceivedError(WebView view, int errorCode, String description, String failingUrl) {
            String htmlData ="<html><body>" + "ErrorNo: " + errorCode + "</body></html>";
            view.loadDataWithBaseURL(failingUrl, htmlData, "text/html", "UTF-8", failingUrl);
            //save failingUrl
            viewModel.setFailingUrl(failingUrl);
        }
    });


reloadButton:

reloadButton.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
           if (!viewModel.getFailingUrl()) {
              webView.loadUrl(viewModel.getFailingUrl());
              return;
           }
           webView.reload();
        }
});


单击reloadButton时可以清除failingUrl,但这不是一个好主意。因为如果在webView恢复正常时更改URL,然后按reloadButton,它将重新加载failingUrl。

最佳答案

正如Rahul Khurana所说,检查它是否是onPageStarted中的failingUrl。
我这样做:

@Override
public void onPageStarted(WebView view, String url, Bitmap favicon) {
   super.onPageStarted(view, url, favicon);
   if (viewModel.getFailingUrl != null) {
      if (!viewModel.getFailingUrl().equals(url)) {
         viewModel.setFailingUrl(null);
      }
   }
}


然后在onClickListener中:

reloadButton.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
           if (!viewModel.getFailingUrl()) {
              webView.loadUrl(viewModel.getFailingUrl());
              //added
              viewModel.setFailingUrl(null);
              return;
           }
           webView.reload();
        }
});


看来行得通!如果用户加载的新URL与failingUrl不同,则在按下重新加载按钮时将不会加载failingUrl。
而且,如果用户尝试在webView中没有错误时尝试重新加载failingUrl,则用户将重新加载failingUrl并清除failingUrl。

我希望有更好的方法来做到这一点...

07-26 00:31