Vic*_*bar 28 android http android-webview
我正在开发一个在WebView中加载网站的Android应用程序,但有时网站会返回HTTP代码500.
我的问题是:有没有办法从带有监听器或其他类的WebView获取HTTP状态代码?
我试图实现一个WebViewClient,但是我无法获得WebView收到的HTTP状态代码.
Jef*_*man 17
这是不可能的(截至我写这篇文章的时候).这些文档onReceiveError()充其量是模棱两可的,但是你看看这个问题,
很明显,不会通过该机制报告HTTP状态代码.开发人员如何编写WebView无法检索HTTP状态代码的方式真的让我大吃一惊.
Ale*_*rev 14
您可以使用ajax加载内容,然后使用loadDataWithBaseURL将其放入webview.
创建这样的网页
<script type="text/javascript">
function loadWithAjax() {
var httpRequest = new XMLHttpRequest();
var path = 'PATH';
var host = 'HOST';
var url = 'URL';
httpRequest.onreadystatechange = function(){
if (httpRequest.readyState === 4) {
if (httpRequest.status === 200) {
browserObject.onAjaxSuccess(host, url, httpRequest.responseText);
} else {
browserObject.onAjaxError(host, url, httpRequest.status);
}
}
};
httpRequest.open('GET', path, true);
httpRequest.send(null);
}
</script>
<body onload="loadWithAjax()">
Run Code Online (Sandbox Code Playgroud)
browserObject是注入javascript的java对象.
addJavascriptInterface(this, "browserObject");
Run Code Online (Sandbox Code Playgroud)
并将其加载到webView中.您应该用您的值替换path/url.
ajaxHtml = IOUtils.toString(getContext().getAssets().open("web/ajax.html"));
ajaxHtml = ajaxHtml.replace("PATH", path);
ajaxHtml = ajaxHtml.replace("URL", url);
ajaxHtml = ajaxHtml.replace("HOST", host);
loadDataWithBaseURL(host, ajaxHtmlFinal, "text/html", null, null);
Run Code Online (Sandbox Code Playgroud)
然后像这样处理onAjaxSuccess/onAjaxError:
public void onAjaxSuccess(final String host, final String url, final String html)
{
((Activity) getContext()).runOnUiThread(new Runnable()
{
@Override
public void run()
{
loadDataWithBaseURL(url, html, "text/html", null, null);
}
});
}
public void onAjaxError(final String host, final String url, final int errorCode)
{
}
Run Code Online (Sandbox Code Playgroud)
现在您可以处理http错误.
您可以覆盖方法 onReceivedHttpError 并在那里您可以看到状态代码:
@Override
public void onReceivedHttpError(WebView view, WebResourceRequest request, WebResourceResponse errorResponse) {
super.onReceivedHttpError(view, request, errorResponse);
int statusCode = errorResponse.getStatusCode();
// TODO: dou your logic..
}
Run Code Online (Sandbox Code Playgroud)
看起来这可以通过 Android M API ( https://code.google.com/p/android/issues/detail?id=82069#c7 ) 中的新回调实现。
void onReceivedHttpError(WebView view, WebResourceRequest request, WebResourceResponse errorResponse)
不幸的是,这很可能在 Android M 之前的设备中不可用。