Android WebViewClient onReceivedError not raised for 404 error

Hi
In the list view, I have a webview that should download the image file from the server, when there is no image, I need a dummy image. I tried

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

I have this web view with a dummy image in FrameLayout, the onPageFinished listener is called after every image URL is loaded, but onReceivedError is not called for the URL that causes 404 error. Oddly enough, how to do this.

+7
source share
5 answers

I had the same problem today,

Problem: onPageFinished is always called. If there is an error, it will be called after onErrorReceived.

This is the solution I 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; } }); 
+3
source

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

In 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) { } 
+3
source

This code looks right; Is it possible that your page does not cause a 404 error?

0
source
 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
source

@Neeraj is on the right track, but my application allows me to update the web view, so I need to clear the error state before any new URL loading. In addition, the error flag must be stored as a member of the data in the parent activity, so that it is preserved during onPageStart () and onPageFinish () - these 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
source

All Articles