Мне приходилось сталкиваться с этой проблемой, а также пытался решить ее с разных точек зрения.Наконец, я нашел решение, используя один флаг, чтобы проверить, произошла ли ошибка.
... extends WebViewClient {
boolean error;
@Override
public void onPageStarted(WebView view, String url, Bitmap favicon) {
showLoading(true);
super.onPageStarted(view, url, favicon);
error = false; // IMPORTANT
}
@Override
public void onPageFinished(WebView view, String url) {
super.onPageFinished(view, url);
if(!error) {
Observable.timer(100, TimeUnit.MICROSECONDS, AndroidSchedulers.mainThread())
.subscribe((data) -> view.setVisibility(View.VISIBLE) );
}
showLoading(false);
}
@Override
public void onReceivedError(WebView view, int errorCode, String description, String failingUrl) {
view.stopLoading();
view.setVisibility(View.INVISIBLE)
error = true;
// Handle the error
}
@Override
@TargetApi(android.os.Build.VERSION_CODES.M)
public void onReceivedError(WebView view,
WebResourceRequest request,
WebResourceError error) {
this.onReceivedError(view, error.getErrorCode(),
error.getDescription().toString(),
request.getUrl().toString());
}
}
Таким образом, я скрываю страницу каждый раз, когда появляется ошибка, и показываю ее, когда страница снова загрузилась правильно.
Также добавлена небольшая задержка в случае.
Я избежал решения о загрузке пустой страницы, так как это не позволяет вам позже выполнить webview.reload (), поскольку она добавляет эту новую страницу в историю переходов.