java - 保存 WebView 并在离线时显示它?
问题描述
我需要以一种在没有互联网的情况下使用缓存的方式缓存 WebView,而当有互联网时,它将使用在线页面。由于我的 WebView 类在 onCreateView 中执行 loadUrl(),它每次都会重新加载它,所以我需要缓存有两个原因:加载速度更快,但主要用于应用程序的离线使用。
import android.os.Bundle;
import android.support.annotation.NonNull;
import android.support.annotation.Nullable;
import android.support.v4.app.Fragment;
import android.net.ConnectivityManager;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.webkit.WebSettings;
import android.webkit.WebView;
import android.webkit.WebViewClient;
public class CalendarFragment extends Fragment {
private WebView webView;
@Nullable
@Override
public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.calendar_layout, container, false);
webView = (WebView) view.findViewById(R.id.calendarWebView);
webView.getSettings().setAppCacheEnabled(true);
webView.getSettings().setDomStorageEnabled(true);
webView.getSettings().setAllowFileAccess(true);
webView.getSettings().setJavaScriptEnabled(true);
webView.getSettings().setAppCachePath(getContext().getCacheDir().getPath());
webView.getSettings().setCacheMode(WebSettings.LOAD_CACHE_ELSE_NETWORK);
webView.setWebViewClient(new WebViewClient());
webView.loadUrl("https://calendar.google.com/calendar/htmlembed?src=wlmacci%40gmail.com&ctz=America%2FToronto");
//webView.loadUrl("https://sites.google.com/view/wlmac/textfile?");
//webView.loadUrl("https://google.ca");
webView.getSettings().setLoadWithOverviewMode(true);
webView.getSettings().setUseWideViewPort(true);
return view;
}
}
我已经尝试过LOAD_DEFAULT
以及LOAD_CACHE_ELSE_NETWORK
似乎都没有工作;当我在关闭 WiFi 的情况下从日历片段切换回它时,我得到了net::ERR_ADDRESS_UNREACHABLE
LOAD_CACHE_ONLY
更新:两者都不起作用
更新:添加ACCESS_NETWORK_STATE
和ACCESS_WIFI_STATE
,现在net::ERR_INTERNET_DISCONNECTED
出现错误
解决方案
将这些权限添加到清单
<uses-permission android:name="android.permission.INTERNET"/>
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE"/>
试试这个代码,
webView = (WebView) view.findViewById(R.id.calendarWebView);
webView.getSettings().setAppCacheMaxSize( 8 * 1024 * 1024 );
webView.getSettings().setAppCachePath(
getApplicationContext().getCacheDir().getAbsolutePath() );
webView.getSettings().setAllowFileAccess( true );
webView.getSettings().setAppCacheEnabled( true );
webView.getSettings().setJavaScriptEnabled( true );
webView.getSettings().setCacheMode( WebSettings.LOAD_DEFAULT );
if ( !isNetworkAvailable() ) //offline
webView.getSettings().setCacheMode( WebSettings.LOAD_CACHE_ONLY );
webView.loadUrl( "https://calendar.google.com/calendar/htmlembed?
src=wlmacci%40gmail.com&ctz=America%2FToronto" );
网络连通性检查方法
private boolean isNetworkAvailable() {
ConnectivityManager connectivityManager = (ConnectivityManager) getSystemService(
CONNECTIVITY_SERVICE );
NetworkInfo activeNetworkInfo = connectivityManager.getActiveNetworkInfo();
return activeNetworkInfo != null && activeNetworkInfo.isConnected();}
推荐阅读
- postgresql - Postgres 正在插入 '$,?' 代替表格中我的地址字段中的文本。是编码问题还是其他问题?
- mysql - 连接两个表后的 SQL 更新 - 不工作
- javascript - 仅在应用程序中动态更改特定的字体大小
- string - 在 VB.NET 中限制 List(Of String) 中的元素数量
- jquery - Tablesorter 未在 Django 中加载
- python-3.x - 与带有参数的 build_fn 一起使用的 KerasClassifier
- javascript - 如何在没有按钮的情况下使用javascript在html表中执行计算(表是在输入值上创建的)?
- amazon-ec2 - Amazon EMR vs EC2 用于卸载 BI 和分析 2018 年
- node.js - 无法使用 https 对同一服务器上的应用程序进行 api 调用
- android - 用于从 EPFO 站点显示的 UAN 详细信息的 API