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);
    }
});

基于 documentationWebSettings.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;
}
  1. 之前而不是设置:

    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);
    
  2. 滑动刷新,你也可以这样做:

    swipeRefreshLayout.setOnRefreshListener(
            new SwipeRefreshLayout.OnRefreshListener() {
                @Override
                public void onRefresh() {
                    if(isNetworkConnected()){
                        ...
                        myWebView.reload();
                    } else {
                          //Do something for non-connectivity
                    }
            }
        });