Android WebView,从缓存加载并尝试刷新
Android WebView, load from cache and attempt to refresh
我正在尝试创建一个加载网页并将其存储在缓存中的小型应用程序。滑动刷新时它必须尝试更新,但如果没有互联网访问它应该保持当前版本。
目前,我有 "swipe to force refresh" 和 "load from the cache" 工作,但似乎无法弄清楚如何 "attempt to refresh if possible"。
swipeRefreshLayout = findViewById(R.id.swipe);
swipeRefreshLayout.setOnRefreshListener(
new SwipeRefreshLayout.OnRefreshListener() {
@Override
public void onRefresh() {
myWebView.clearCache(true);
myWebView.reload();
}
}
);
WebSettings webSettings = myWebView.getSettings();
webSettings.setJavaScriptEnabled(true);
webSettings.setAppCacheEnabled(true);
webSettings.setAppCachePath(getBaseContext().getCacheDir().getPath());
webSettings.setCacheMode(WebSettings.LOAD_CACHE_ELSE_NETWORK);
myWebView.loadUrl(config.getString("website_root"));
myWebView.setWebViewClient(new WebViewClient() {
@Override
public void onPageStarted(WebView view, String url, Bitmap favicon) {
if (!swipeRefreshLayout.isRefreshing()) {
swipeRefreshLayout.setRefreshing(true);
}
}
@Override
public void onPageFinished(WebView view, String url) {
swipeRefreshLayout.setRefreshing(false);
}
});
基于 documentation 的 WebSettings.LOAD_CACHE_ELSE_NETWORK
:
Use cached resources when they are available, even if they have
expired. Otherwise load resources from the network
因此,您的视图总是从缓存中加载。
您可以使用以下方法:
1. 检查连通性:
private boolean isNetworkConnected() {
ConnectivityManager cm = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE);
return cm.getActiveNetworkInfo() != null;
}
之前而不是设置:
WebSettings webSettings = myWebView.getSettings();
webSettings.setJavaScriptEnabled(true);
webSettings.setAppCacheEnabled(true);
webSettings.setAppCachePath(getBaseContext().getCacheDir().getPath());
webSettings.setCacheMode(isNetworkConnected()?WebSettings.LOAD_NO_CACHE: WebSettings.LOAD_CACHE_ONLY);
滑动刷新,你也可以这样做:
swipeRefreshLayout.setOnRefreshListener(
new SwipeRefreshLayout.OnRefreshListener() {
@Override
public void onRefresh() {
if(isNetworkConnected()){
...
myWebView.reload();
} else {
//Do something for non-connectivity
}
}
});
我正在尝试创建一个加载网页并将其存储在缓存中的小型应用程序。滑动刷新时它必须尝试更新,但如果没有互联网访问它应该保持当前版本。
目前,我有 "swipe to force refresh" 和 "load from the cache" 工作,但似乎无法弄清楚如何 "attempt to refresh if possible"。
swipeRefreshLayout = findViewById(R.id.swipe);
swipeRefreshLayout.setOnRefreshListener(
new SwipeRefreshLayout.OnRefreshListener() {
@Override
public void onRefresh() {
myWebView.clearCache(true);
myWebView.reload();
}
}
);
WebSettings webSettings = myWebView.getSettings();
webSettings.setJavaScriptEnabled(true);
webSettings.setAppCacheEnabled(true);
webSettings.setAppCachePath(getBaseContext().getCacheDir().getPath());
webSettings.setCacheMode(WebSettings.LOAD_CACHE_ELSE_NETWORK);
myWebView.loadUrl(config.getString("website_root"));
myWebView.setWebViewClient(new WebViewClient() {
@Override
public void onPageStarted(WebView view, String url, Bitmap favicon) {
if (!swipeRefreshLayout.isRefreshing()) {
swipeRefreshLayout.setRefreshing(true);
}
}
@Override
public void onPageFinished(WebView view, String url) {
swipeRefreshLayout.setRefreshing(false);
}
});
基于 documentation 的 WebSettings.LOAD_CACHE_ELSE_NETWORK
:
Use cached resources when they are available, even if they have expired. Otherwise load resources from the network
因此,您的视图总是从缓存中加载。
您可以使用以下方法: 1. 检查连通性:
private boolean isNetworkConnected() {
ConnectivityManager cm = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE);
return cm.getActiveNetworkInfo() != null;
}
之前而不是设置:
WebSettings webSettings = myWebView.getSettings(); webSettings.setJavaScriptEnabled(true); webSettings.setAppCacheEnabled(true); webSettings.setAppCachePath(getBaseContext().getCacheDir().getPath()); webSettings.setCacheMode(isNetworkConnected()?WebSettings.LOAD_NO_CACHE: WebSettings.LOAD_CACHE_ONLY);
滑动刷新,你也可以这样做:
swipeRefreshLayout.setOnRefreshListener( new SwipeRefreshLayout.OnRefreshListener() { @Override public void onRefresh() { if(isNetworkConnected()){ ... myWebView.reload(); } else { //Do something for non-connectivity } } });