Android记录25-WebView实现离线缓存阅读,秀出天际

本文介绍了如何在Android中实现WebView的离线缓存功能,通过设置缓存模式、开启DOM storage和database storage API,确保在网络不稳定时仍能加载网页。详细展示了设置缓存路径、WebChromeClient和WebViewClient的相关方法,以及如何清理WebView缓存。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

这里写图片描述

如果我们手机有root的权限的话,就可以看到/data/data/package_name/下的文件目录,我们就会发现webview为我们创建

app_webview,这个应该就是webview的缓存目录的位置。

public void initWebView() {

mWebView.getSettings().setJavaScriptEnabled(true);

mWebView.getSettings().setRenderPriority(RenderPriority.HIGH);

// 建议缓存策略为,判断是否有网络,有的话,使用LOAD_DEFAULT,无网络时,使用LOAD_CACHE_ELSE_NETWORK

mWebView.getSettings().setCacheMode(WebSettings.LOAD_CACHE_ELSE_NETWORK); // 设置缓存模式

// 开启DOM storage API 功能

mWebView.getSettings().setDomStorageEnabled(true);

// 开启database storage API功能

mWebView.getSettings().setDatabaseEnabled(true);

String cacheDirPath = getFilesDir().getAbsolutePath()

  • APP_CA

《Android学习笔记总结+最新移动架构视频+大厂安卓面试真题+项目实战源码讲义》

【docs.qq.com/doc/DSkNLaERkbnFoS0ZF】 完整内容开源分享

CHE_DIRNAME;

Log.i(“cachePath”, cacheDirPath);

// 设置数据库缓存路径

mWebView.getSettings().setDatabasePath(cacheDirPath); // API 19 deprecated

// 设置Application caches缓存目录

mWebView.getSettings().setAppCachePath(cacheDirPath);

// 开启Application Cache功能

mWebView.getSettings().setAppCacheEnabled(true);

Log.i(“databasepath”, mWebView.getSettings().getDatabasePath());

}

这里加载我博客里的一篇文章:

这里写图片描述

public void findView() {

initWebView();

mWebView.setWebViewClient(new WebViewClient() {

@Override

public void onLoadResource(WebView view, String url) {

Log.i(TAG, “onLoadResource url=” + url);

super.onLoadResource(view, url);

}

@Override

public boolean shouldOverrideUrlLoading(WebView view, String url) {

Log.i(TAG, “intercept url=” + url);

view.loadUrl(url);

return true;

}

// 页面开始时调用

@Override

public void onPageStarted(WebView view, String url, Bitmap favicon) {

Log.e(TAG, “onPageStarted”);

super.onPageStarted(view, url, favicon);

}

// 页面加载完成调用

@Override

public void onPageFinished(WebView view, String url) {

super.onPageFinished(view, url);

}

@Override

public void onReceivedError(WebView view, int errorCode,

String description, String failingUrl) {

super.onReceivedError(view, errorCode, description, failingUrl);

Toast.makeText(getApplicationContext(), “”, Toast.LENGTH_LONG)

.show();

}

});

mWebView.setWebChromeClient(new WebChromeClient() {

@Override

public boolean onJsAlert(WebView view, String url, String message,

JsResult result) {

Log.e(TAG, "onJsAlert " + message);

Toast.makeText(getApplicationContext(), message,

Toast.LENGTH_SHORT).show();

result.confirm();

return super.onJsAlert(view, url, message, result);

}

@Override

public boolean onJsConfirm(WebView view, String url,

String message, JsResult result) {

Log.e(TAG, "onJsConfirm " + message);

return super.onJsConfirm(view, url, message, result);

}

@Override

public boolean onJsPrompt(WebView view, String url, String message,

String defaultValue, JsPromptResult result) {

Log.e(TAG, "onJsPrompt " + url);

return super.onJsPrompt(view, url, message, defaultValue,

result);

}

});

mWebView.loadUrl(url);

}

完整代码


package com.infzm.webview;

import java.io.File;

import android.app.Activity;

import android.content.Intent;

import android.graphics.Bitmap;

import android.net.Uri;

import android.os.Bundle;

import android.util.Log;

import android.view.KeyEvent;

import android.view.View;

import android.view.View.OnClickListener;

import android.webkit.JsPromptResult;

import android.webkit.JsResult;

import android.webkit.WebChromeClient;

import android.webkit.WebSettings;

import android.webkit.WebSettings.RenderPriority;

import android.webkit.WebView;

import android.webkit.WebViewClient;

import android.widget.Button;

import android.widget.Toast;

public class MainActivity extends Activity implements OnClickListener {

private WebView mWebView;

private Button nightModeBtn;

private Button lightModeBtn;

// -----

private static final String TAG = MainActivity.class.getSimpleName();

private static final String APP_CACHE_DIRNAME = “/webcache”; // web缓存目录

private String url; // 网页url

@Override

protected void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.activity_main);

mWebView = (WebView) this.findViewById(R.id.webview);

nightModeBtn = (Button) this.findViewById(R.id.btn_nightmode);

lightModeBtn = (Button) this.findViewById(R.id.btn_lightmode);

nightModeBtn.setOnClickListener(this);

lightModeBtn.setOnClickListener(this);

// webView.loadUrl(“http://www.baidu.com”);

WebSettings settings = mWebView.getSettings();

// 设置javaScript可用

settings.setJavaScriptEnabled(true);

// 绑定javaScript接口,可以实现在javaScript中调用我们的Android代码

// webView.addJavascriptInterface(new WebAppInterface(this), “Android”);

// webView.setWebViewClient(new MyWebViewClient());

// 加载assets目录下的html页面

// mWebView.loadUrl(“file:///android_asset/01.html”);

url = “http://blog.youkuaiyun.com/wwj_748/article/details/44810283”;

findView();

}

public void findView() {

initWebView();

mWebView.setWebViewClient(new WebViewClient() {

@Override

public void onLoadResource(WebView view, String url) {

Log.i(TAG, “onLoadResource url=” + url);

super.onLoadResource(view, url);

}

@Override

public boolean shouldOverrideUrlLoading(WebView view, String url) {

Log.i(TAG, “intercept url=” + url);

view.loadUrl(url);

return true;

}

// 页面开始时调用

@Override

public void onPageStarted(WebView view, String url, Bitmap favicon) {

Log.e(TAG, “onPageStarted”);

super.onPageStarted(view, url, favicon);

}

// 页面加载完成调用

@Override

public void onPageFinished(WebView view, String url) {

super.onPageFinished(view, url);

}

@Override

public void onReceivedError(WebView view, int errorCode,

String description, String failingUrl) {

super.onReceivedError(view, errorCode, description, failingUrl);

Toast.makeText(getApplicationContext(), “”, Toast.LENGTH_LONG)

.show();

}

});

mWebView.setWebChromeClient(new WebChromeClient() {

@Override

public boolean onJsAlert(WebView view, String url, String message,

JsResult result) {

Log.e(TAG, "onJsAlert " + message);

Toast.makeText(getApplicationContext(), message,

Toast.LENGTH_SHORT).show();

result.confirm();

return super.onJsAlert(view, url, message, result);

}

@Override

public boolean onJsConfirm(WebView view, String url,

String message, JsResult result) {

Log.e(TAG, "onJsConfirm " + message);

return super.onJsConfirm(view, url, message, result);

}

@Override

public boolean onJsPrompt(WebView view, String url, String message,

String defaultValue, JsPromptResult result) {

Log.e(TAG, "onJsPrompt " + url);

return super.onJsPrompt(view, url, message, defaultValue,

result);

}

});

mWebView.loadUrl(url);

}

public void initWebView() {

mWebView.getSettings().setJavaScriptEnabled(true);

mWebView.getSettings().setRenderPriority(RenderPriority.HIGH);

// 建议缓存策略为,判断是否有网络,有的话,使用LOAD_DEFAULT,无网络时,使用LOAD_CACHE_ELSE_NETWORK

mWebView.getSettings().setCacheMode(WebSettings.LOAD_CACHE_ELSE_NETWORK); // 设置缓存模式

// 开启DOM storage API 功能

mWebView.getSettings().setDomStorageEnabled(true);

// 开启database storage API功能

mWebView.getSettings().setDatabaseEnabled(true);

String cacheDirPath = getFilesDir().getAbsolutePath()

  • APP_CACHE_DIRNAME;

Log.i(“cachePath”, cacheDirPath);

// 设置数据库缓存路径

mWebView.getSettings().setDatabasePath(cacheDirPath); // API 19 deprecated

// 设置Application caches缓存目录

mWebView.getSettings().setAppCachePath(cacheDirPath);

// 开启Application Cache功能

mWebView.getSettings().setAppCacheEnabled(true);

Log.i(“databasepath”, mWebView.getSettings().getDatabasePath());

}

public void clearWebViewCache() {

// 清理WebView缓存数据库

try {

deleteDatabase(“webview.db”);

deleteDatabase(“webviewCache.db”);

} catch (Exception e) {

e.printStackTrace();

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值