安卓WebView,从缓存加载并尝试刷新

3
我正在尝试创建一个小应用程序,它会加载网页并将其存储在缓存中。在下拉刷新时,它必须尝试更新,但如果没有互联网访问,则应保留当前版本。
目前,我已经实现了“下拉强制刷新”和“从缓存中加载”,但似乎无法找到“尝试刷新(如果可能)”的方法。
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);
    }
});

如果可能的话,"attempt to refresh if possible" 的意思是什么?你是指稍后重试吗? - Sagar
在启动时,它将从缓存中加载,如果缓存不存在,则从网络加载。我希望它在加载时从缓存中加载,并且如果有网络访问,尝试获取页面的更新版本。如果成功了,就加载它。如果不成功,没关系,下次好运。 - Matt Smeets
1个回答

3
基于 WebSettings.LOAD_CACHE_ELSE_NETWORK文档

当缓存资源可用时使用它们,即使它们已过期。否则从网络加载资源。

因此,您的视图始终从缓存中加载。
您可以使用以下方法: 1. 检查连接:
private boolean isNetworkConnected() {
    ConnectivityManager cm = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE);

    return cm.getActiveNetworkInfo() != null;
}
  1. Before instead of setting:

    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. On Swipe to refresh, you can do the same:

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

你的使用方式是错误的。每次都从缓存加载网站是不必要的。一般来说,缓存是一个好东西,解决方法是使用:webSetting.setCacheMode(WebSetting.LOAD_DEFAULT)。 - Barel elbaz

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接