java - 将 webview 自动保存到本地存储中
问题描述
Webview 每次打开时都会加载,有什么方法可以在我第一次打开时将 Web 视图文件保存在本地存储中,当我再次打开时,它们不需要下载。意味着即使没有互联网,它们也会打开。
这是我的java文件。有什么方法可以执行此任务
package com.example.impwala;
import android.app.ProgressDialog;
import android.content.DialogInterface;
import android.graphics.Bitmap;
import android.net.ConnectivityManager;
import android.net.NetworkInfo;
import android.os.Bundle;
import android.webkit.WebView;
import android.webkit.WebViewClient;
import androidx.appcompat.app.AlertDialog;
import androidx.appcompat.app.AppCompatActivity;
public class chemistry1 extends AppCompatActivity {
WebView chem1;
ProgressDialog pDialog;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_chemistry1);
if (haveNetwork())
{
init();
listener();
}
else if (!haveNetwork())
{
AlertDialog.Builder builder =new AlertDialog.Builder(this);
builder.setTitle("No internet Connection");
builder.setMessage("Please turn on internet connection to continue");
builder.setNegativeButton("close", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
dialog.dismiss();
}
});
AlertDialog alertDialog = builder.create();
alertDialog.show(); }
}
public boolean haveNetwork()
{
boolean have_WIFI=false;
boolean have_MobileData=false;
ConnectivityManager connectivityManager=(ConnectivityManager) getSystemService(CONNECTIVITY_SERVICE);
NetworkInfo[] networkInfos=connectivityManager.getAllNetworkInfo();
for (NetworkInfo info:networkInfos)
{
if (info.getTypeName().equalsIgnoreCase("WIFI"))
if(info.isConnected())
have_WIFI=true;
if (info.getTypeName().equalsIgnoreCase("MOBILE"))
if(info.isConnected())
have_MobileData=true;
}
return have_MobileData||have_WIFI;
}
private void init() {
chem1 = (WebView) findViewById(R.id.chem1);
chem1.getSettings().setJavaScriptEnabled(true);
pDialog = new ProgressDialog(chemistry1.this);
pDialog.setTitle("PDF");
pDialog.setMessage("Loading...");
pDialog.setIndeterminate(false);
pDialog.setCancelable(false);
chem1.loadUrl("www.example.com");
}
private void listener() {
chem1.setWebViewClient(new WebViewClient() {
@Override
public void onPageStarted(WebView view, String url, Bitmap favicon) {
super.onPageStarted(view, url, favicon);
pDialog.show();
}
@Override
public void onPageFinished(WebView view, String url) {
super.onPageFinished(view, url);
pDialog.dismiss();
}
});
}
}
解决方案
将您的页面作为 Web 存档保存到公共文档文件夹中的 SD 卡存储中,
File file;
String filenameExternal = "mypage";
if (Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED{
file = new File(Environment.getExternalStoragePublicDirectory(
Environment.DIRECTORY_DOCUMENTS), filenameExternal);
}
chem1.saveWebArchive(file.toString()+".mht");
然后,当用户通过覆盖@OnStop
方法离开应用程序时,使用共享首选项保存文件名/路径。最后,当用户重新打开应用程序时,通过从共享首选项中读取文件路径来加载您保存的页面。
if (Build.VERSION.SDK_INT >= VERSION_CODES.KITKAT) {
chem1.loadUrl(file.toString()+".mht");
} else {
loadOfflinePageBelowKitKat(position);
}
loadOfflinePageBelowKitKat 方法
public void loadOfflinePageBelowKitKat(){
String rawData = null;
try{
rawData = getStringFromFile(file.toString()+".mht");
}catch (Exception e){
e.printStackTrace();
}
chem1.loadDataWithBaseURL(null, rawData, "application/x-webarchive-xml", "UTF-8", null);
}
getStringFromFile 方法
public String getStringFromFile(String filePath) throws Exception{
File file = new File(filePath);
FileInputStream fInputStream = new FileInputStream(file);
String wantedString = convertStreamToString(fInputStream);
fInputStream.close();
return wantedString;
}
我假设您熟悉处理共享首选项和文件。
推荐阅读
- wpf - 即使属性已更改,PropertyChanged 仍为 null
- reactjs - 如何使用 withRouter 在 history.push() 之后更新状态?
- vb.net - 使用 ProcessCmdKey 捕获 F1 调用两个网页
- perl - Perl CPAN 无法安装 Tkx
- javascript - 在本地测试 onCall https 云功能
- javascript - 发送 DM,然后在新用户加入后对消息做出反应
- lua - 如何在 tarantool 中进行 UPDATE ... SET MAX (column, 5)
- java - (ClassGenException) 找不到分支的目标:ifeq [153]
- android - SyntaxError:JSON 解析错误:React Native 的无法识别的标记“<”
- java - hadoop 3.1.3 的线程“主”org.apache.hadoop.ipc.RemoteException(java.io.IOException) 中的异常