Android WebViewClient onReceivedError is not called for a 404 error

前端 未结 5 2161
不知归路
不知归路 2021-02-19 10:57

hi
In a list view i have an webview which should load a image file from the server,when there is no image present i need a dummy image .I tried

holder.imag         


        
相关标签:
5条回答
  • 2021-02-19 11:21
    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 ); 
        } 
      }); 
    
    0 讨论(0)
  • 2021-02-19 11:28

    I had the same issue today,

    The problem: onPageFinished is called always. If there is an error it will be called after onErrorReceived.

    This is the solution I've found:

    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;
        }
    
    });
    
    0 讨论(0)
  • 2021-02-19 11:31

    @Neeraj is on the right track, but my app allows a refresh of the webview, so I need to clear the error state before any new URL load. Furthermore, the error flag must be stored as a data member on the parent activity so that it persists during onPageStart() and onPageFinish()--those methods can be called after 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();
          }
    
    0 讨论(0)
  • 2021-02-19 11:34

    That code looks correct; is it possible that your page is not generating a 404 error?

    0 讨论(0)
  • 2021-02-19 11:45

    I had to override WebViewClient.onReceivedHttpError() instead of 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);
        }
    

    From the WebClient documentation:

    /**
     * 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) {
    }
    
    0 讨论(0)
提交回复
热议问题