【问题标题】:Android WebViewClient onReceivedError is not called for a 404 errorAndroid WebViewClient onReceivedError 未调用 404 错误
【发布时间】:2011-03-25 14:31:10
【问题描述】:


在列表视图中,我有一个 webview,它应该从服务器加载图像文件,当没有图像存在时,我需要一个虚拟图像。我试过了

holder.image.setWebViewClient(new WebViewClient()
{
                  @Override
                public void onReceivedError( WebView view, int errorCode, String description, String failingUrl) 
                {

                    System.out.println("description error" + description);
                    view.setVisibility( View.GONE );

                }

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

                    view.setVisibility( View.VISIBLE );


                }


   }); 

我在 FrameLayout 中有一个带有虚拟图像的 webview,在加载每个图像 url 后调用 onPageFinished 侦听器,但不会为产生 404 错误的 url 调用 onReceivedError。猜猜怎么做。

【问题讨论】:

  • 我尝试使用 HttpClient 并在检查 HttpStatus 时,如果 HttpStatus 返回错误消息,我已经加载了 url,然后我限制加载 url,而是显示无图像 png。这种方法很麻烦吗,任何人都可以为此提出替代方案。
  • 无法使用 WebView 完成,但是您可以使用基本的 HTTPClient 并检查响应代码。这是有关如何执行此操作的链接:stackoverflow.com/questions/2592843/…

标签: android webview webviewclient


【解决方案1】:

我必须重写 WebViewClient.onReceivedHttpError() 而不是 WebViewClient.onReceivedError()。

    @Override
    public void onReceivedHttpError(final WebView view, final WebResourceRequest request, WebResourceResponse errorResponse) {
        final int statusCode;
        // SDK < 21 does not provide statusCode
        if (Build.VERSION.SDK_INT < 21) {
            statusCode = STATUS_CODE_UNKNOWN;
        } else {
            statusCode = errorResponse.getStatusCode();
        }

        Log().d(LOG_TAG, "[onReceivedHttpError]" + statusCode);
    }

来自 WebClient 文档:

/**
 * Notify the host application that an HTTP error has been received from the server while
 * loading a resource.  HTTP errors have status codes &gt;= 400.  This callback will be called
 * for any resource (iframe, image, etc), not just for the main page. Thus, it is recommended to
 * perform minimum required work in this callback. Note that the content of the server
 * response may not be provided within the <b>errorResponse</b> parameter.
 * @param view The WebView that is initiating the callback.
 * @param request The originating request.
 * @param errorResponse Information about the error occured.
 */
public void onReceivedHttpError(
        WebView view, WebResourceRequest request, WebResourceResponse errorResponse) {
}

【讨论】:

  • onReceivedHttpError 如果 API 级别 不可用
【解决方案2】:

我今天也遇到了同样的问题,

问题:onPageFinished 总是被调用。如果有错误会在 onErrorReceived 之后调用。

这是我找到的解决方案:

holder.image.setWebViewClient(new WebViewClient() {

    private boolean error;

    @Override
    public void onPageStarted(WebView view, String url, Bitmap favicon) {

        super.onPageStarted(view, url, favicon);
        error = false;
    }

    @Override
    public void onReceivedError( WebView view, int errorCode, String description, String failingUrl)  {

        error = true;
        System.out.println("description error" + description);
        view.setVisibility( View.GONE );
    }

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

        if (!error) {
            view.setVisibility( View.VISIBLE );
        }
        error = false;
    }

});

【讨论】:

    【解决方案3】:

    @Neeraj 是在正确的轨道上,但我的应用程序允许刷新 web 视图,所以我需要在任何新的 URL 加载之前清除错误状态。此外,错误标志必须作为数据成员存储在父活动上,以便它在 onPageStart() 和 onPageFinish() 期间持续存在——这些方法可以在 onError() 之后调用

    public class MyActivity extends Activity {
        private boolean isError;
        ...
        protected void onResume() {
            super.onResume();
            isError = false;
            myWebView.loadUrl(myUrl);
        }
    
        public class MyWebViewClient extends WebViewClient {
        /**
         * can be called even after error (embedded images?), so error flag must keep state as data-member in activity, cleared by activity before each loadUrl();          
         */
          @Override
          public void onPageFinished(WebView view, String url) {
            if (!isError)
                showContent();
          }
    
          @Override
          public void onReceivedError(WebView view, int errorCode, String description, String failingUrl) {
            isError = true;
            showError();
          }
    

    【讨论】:

      【解决方案4】:

      为了在我的 API WebViewClient 或 WebViewClientCompat 类):

      @Override
      public void onPageFinished(WebView view, String url) {
          if (!WebViewFeature.isFeatureSupported(WebViewFeature.RECEIVE_HTTP_ERROR)) {
              if (view.getTitle().equals("404 Not Found")) {
                  // Handle HTTP 404 error here.
              }
              // TODO: Handle more errors, not just 404.
          }
      }
      

      所以我尝试通过查看页面标题来检测 HTTP 错误。有点骇人听闻,但它适用于我的特定情况(请求的页面由我自己的服务器托管,因此我可以确定错误页面的外观 - 对于不受您控制的网络服务器,这可能会更困难)。

      【讨论】:

        【解决方案5】:

        该代码看起来正确;您的页面是否可能没有生成 404 错误?

        【讨论】:

        • 这应该是问题下的评论,而不是回复。
        【解决方案6】:
        holder.image.setWebViewClient(new WebViewClient() { 
        
            boolean bReceivedError = false;
        
            @Override
            public void onReceivedError( WebView view, int errorCode,
                                         String description, String failingUrl) { 
              bReceivedError = true;
              view.setVisibility( View.GONE ); 
            }
        
            @Override 
            public void onPageFinished(WebView view, String url) { 
              if(!bReceivedError)
                view.setVisibility( View.VISIBLE ); 
            } 
          }); 
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2013-08-09
          • 2012-02-29
          相关资源
          最近更新 更多