Android WebViewClient onReceivedError 未调用 404 错误
Posted
技术标签:
【中文标题】Android WebViewClient onReceivedError 未调用 404 错误【英文标题】:Android WebViewClient onReceivedError is not called for a 404 error 【发布时间】: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。猜猜怎么做。
【问题讨论】:
好像不行:***.com/questions/5124052/… 我尝试使用 HttpClient 并在检查 HttpStatus 时,如果 HttpStatus 返回错误消息,我已经加载了 url,然后我限制加载 url,而是显示无图像 png。这种方法很麻烦吗,任何人都可以为此提出替代方案。 无法使用 WebView 完成,但是您可以使用基本的 HTTPClient 并检查响应代码。这是有关如何执行此操作的链接:***.com/questions/2592843/… 【参考方案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 >= 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 );
);
【讨论】:
以上是关于Android WebViewClient onReceivedError 未调用 404 错误的主要内容,如果未能解决你的问题,请参考以下文章
在 Android WebViewClient 中获取空白页
Android WebViewClient url 重定向(Android URL 加载系统)
Android - 在 AsyncTask 中设置 WebViewClient 会导致 NullPointerException
Android WebViewClient,有404时不会调用onErrorReceived