Android WebViewClient onReceivedError не вызывается для ошибки 404 - PullRequest
10 голосов
/ 25 марта 2011

привет
В виде списка у меня есть веб-просмотр, который должен загрузить файл изображения с сервера, когда нет изображения, мне нужно фиктивное изображение. Я пробовал

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, слушатель onPageFinished вызывается после загрузки каждого URL-адреса изображения, но onReceivedError не вызывается для URL-адреса, который выдает ошибку 404. Любое предположение, как это сделать.

Ответы [ 5 ]

4 голосов
/ 21 июля 2016

Мне пришлось переопределить 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) {
}
3 голосов
/ 07 ноября 2014

У меня была такая же проблема сегодня,

Проблема: 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;
    }

});
0 голосов
/ 06 января 2012
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 голосов
/ 14 марта 2012

@ Neeraj находится на правильном пути, но мое приложение позволяет обновить веб-просмотр, поэтому мне нужно очистить состояние ошибки перед любой новой загрузкой 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();
      }
0 голосов
/ 25 марта 2011

Этот код выглядит правильно;Возможно ли, что ваша страница не генерирует ошибку 404?

...