在加载页面期间关闭互联网连接时,WebView 需要很长时间
WebView take very long time when close internet connection during loading page
我开发了 android 应用程序,我有一个 webview 可以为用户显示一些网络内容。
现在我尝试做一些集成测试用例,以确保所有事情都是正确的。
其中一个测试用例是在加载页面期间关闭互联网连接并检查行为。
这是我的代码:
@Override
public void initializeWebViewCallbacks() {
if(!InternetHelper.isThereInternetConnection(AuthFragment.this.context()))
{
AuthFragment.this.showRetry();
}
else{
wv_auth.setWebViewClient(new WebViewClient());
wv_auth.getSettings().setRenderPriority(WebSettings.RenderPriority.HIGH);
wv_auth.getSettings().setCacheMode(WebSettings.LOAD_NO_CACHE);
if (Build.VERSION.SDK_INT >= 19) {
wv_auth.setLayerType(View.LAYER_TYPE_HARDWARE, null);
}
else {
wv_auth.setLayerType(View.LAYER_TYPE_SOFTWARE, null);
}
wv_auth.loadUrl("http://myurl");
wv_auth.setWebViewClient(new WebViewClient() {
@Override
public void onReceivedHttpError(WebView view, WebResourceRequest request, WebResourceResponse errorResponse) {
super.onReceivedHttpError(view, request, errorResponse);
wv_auth.setVisibility(View.GONE);
AuthFragment.this.hideLoading();
AuthFragment.this.showRetry();
}
@Override
public void onPageStarted(WebView view, String url, Bitmap favicon)
{
super.onPageStarted(view, url, favicon);
AuthFragment.this.showLoading();
}
@SuppressWarnings("deprecation")
@Override
public boolean shouldOverrideUrlLoading(WebView view, String url) {
view.loadUrl(url);
return true;
}
@TargetApi(android.os.Build.VERSION_CODES.M)
public boolean shouldOverrideUrlLoading(WebView view, WebResourceRequest request) {
return shouldOverrideUrlLoading(view, request.toString());
}
@Override
public void onPageFinished(WebView view, String url) {
super.onPageFinished(view, url);
AuthFragment.this.hideLoading();
// some code
new Handler().postDelayed(new Runnable() {
public void run() {
((BaseActivity)getActivity()).navigator.navigateToMainActivity(AuthFragment.this.getActivity(),false);
}
}, 200);
}
}
@SuppressWarnings("deprecation")
@Override
public void onReceivedError(WebView view, int errorCode, String description, String failingUrl) {
super.onReceivedError(view,errorCode,description,failingUrl);
// Handle the error
wv_auth.setVisibility(View.GONE);
AuthFragment.this.hideLoading();
AuthFragment.this.showRetry();
}
@TargetApi(android.os.Build.VERSION_CODES.M)
@Override
public void onReceivedError(WebView view, WebResourceRequest req, WebResourceError rerr) {
// Redirect to deprecated method, so you can use it in all SDK versions
onReceivedError(view, rerr.getErrorCode(), rerr.getDescription().toString(), req.getUrl().toString());
}
});
}
}
当我在加载页面的过程中关闭互联网连接时,进度圈仍然 运行 大约 30 分钟并且断点没有通过 onReceivedError(...) 所以我无法处理这种情况,有什么建议吗??
我认为这是 loadUrl(..) 方法的问题。
我尝试了所有可能的解决方案,并遵循了这里的所有解决方案:SO question 但没有机会。
我注意到,当您创建托管 Web 视图的 activity 或片段时,一切正常,所以我通过导航到另一个中间空白 activity 1 秒然后 return 回到这个 activity 并且通过这个我解决了问题。
我开发了 android 应用程序,我有一个 webview 可以为用户显示一些网络内容。
现在我尝试做一些集成测试用例,以确保所有事情都是正确的。
其中一个测试用例是在加载页面期间关闭互联网连接并检查行为。
这是我的代码:
@Override
public void initializeWebViewCallbacks() {
if(!InternetHelper.isThereInternetConnection(AuthFragment.this.context()))
{
AuthFragment.this.showRetry();
}
else{
wv_auth.setWebViewClient(new WebViewClient());
wv_auth.getSettings().setRenderPriority(WebSettings.RenderPriority.HIGH);
wv_auth.getSettings().setCacheMode(WebSettings.LOAD_NO_CACHE);
if (Build.VERSION.SDK_INT >= 19) {
wv_auth.setLayerType(View.LAYER_TYPE_HARDWARE, null);
}
else {
wv_auth.setLayerType(View.LAYER_TYPE_SOFTWARE, null);
}
wv_auth.loadUrl("http://myurl");
wv_auth.setWebViewClient(new WebViewClient() {
@Override
public void onReceivedHttpError(WebView view, WebResourceRequest request, WebResourceResponse errorResponse) {
super.onReceivedHttpError(view, request, errorResponse);
wv_auth.setVisibility(View.GONE);
AuthFragment.this.hideLoading();
AuthFragment.this.showRetry();
}
@Override
public void onPageStarted(WebView view, String url, Bitmap favicon)
{
super.onPageStarted(view, url, favicon);
AuthFragment.this.showLoading();
}
@SuppressWarnings("deprecation")
@Override
public boolean shouldOverrideUrlLoading(WebView view, String url) {
view.loadUrl(url);
return true;
}
@TargetApi(android.os.Build.VERSION_CODES.M)
public boolean shouldOverrideUrlLoading(WebView view, WebResourceRequest request) {
return shouldOverrideUrlLoading(view, request.toString());
}
@Override
public void onPageFinished(WebView view, String url) {
super.onPageFinished(view, url);
AuthFragment.this.hideLoading();
// some code
new Handler().postDelayed(new Runnable() {
public void run() {
((BaseActivity)getActivity()).navigator.navigateToMainActivity(AuthFragment.this.getActivity(),false);
}
}, 200);
}
}
@SuppressWarnings("deprecation")
@Override
public void onReceivedError(WebView view, int errorCode, String description, String failingUrl) {
super.onReceivedError(view,errorCode,description,failingUrl);
// Handle the error
wv_auth.setVisibility(View.GONE);
AuthFragment.this.hideLoading();
AuthFragment.this.showRetry();
}
@TargetApi(android.os.Build.VERSION_CODES.M)
@Override
public void onReceivedError(WebView view, WebResourceRequest req, WebResourceError rerr) {
// Redirect to deprecated method, so you can use it in all SDK versions
onReceivedError(view, rerr.getErrorCode(), rerr.getDescription().toString(), req.getUrl().toString());
}
});
}
}
当我在加载页面的过程中关闭互联网连接时,进度圈仍然 运行 大约 30 分钟并且断点没有通过 onReceivedError(...) 所以我无法处理这种情况,有什么建议吗??
我认为这是 loadUrl(..) 方法的问题。
我尝试了所有可能的解决方案,并遵循了这里的所有解决方案:SO question 但没有机会。
我注意到,当您创建托管 Web 视图的 activity 或片段时,一切正常,所以我通过导航到另一个中间空白 activity 1 秒然后 return 回到这个 activity 并且通过这个我解决了问题。