【问题标题】:Best way to load a custom error html file in a webview在 web 视图中加载自定义错误 html 文件的最佳方法
【发布时间】:2019-07-12 04:08:20
【问题描述】:
  1. 当发生一些错误(互联网断开连接,超时...)时,自定义 html 页面会在 webview 中加载,并且 failedUrl 保存在 viewModel 中。

  2. 当按下重新加载按钮时,它会尝试重新加载失败的Url。

问题是每次我加载自定义 html 文件时,都会在 onPageStarted 中再次调用它并清除 failedUrl。所以 failedUrl 将为空。调用 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.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
           if (!viewModel.getFailingUrl()) {
              webView.loadUrl(viewModel.getFailingUrl());
              return;
           }
           webView.reload();
        }
});

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

【问题讨论】:

  • 检查onPageStarted方法中的url,看看是不是你下落的url??
  • 我应该把它作为答案发布吗?
  • 请。如果可以的话,更详细。
  • 好的。我加了一个

标签: java android webview


【解决方案1】:

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

@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();
        }
});

它似乎工作!如果用户加载了一个不同于failureUrl 的新url,那么当按下reload 按钮时,failingUrl 将不会被加载。 如果用户在 webView 没有错误的情况下尝试重新加载 failedUrl,则用户将重新加载 failedUrl 并清除 failedUrl。

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

【讨论】:

    【解决方案2】:

    onPageStarted 方法中检查它是否是失败的URL。您可能需要在某处保存来自 onReceivedError 方法的失败 URL,以便当网络连接恢复或满足条件时,您可以加载它。

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

    reload 按钮 clickListener 事件将失败的 URL 设置为 null

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-06-16
      • 1970-01-01
      • 2022-01-16
      • 2017-11-02
      • 1970-01-01
      • 2010-11-14
      • 2020-01-11
      • 1970-01-01
      相关资源
      最近更新 更多