电脑知识|欧美黑人一区二区三区|软件|欧美黑人一级爽快片淫片高清|系统|欧美黑人狂野猛交老妇|数据库|服务器|编程开发|网络运营|知识问答|技术教程文章 - 好吧啦网

您的位置:首頁技術文章
文章詳情頁

Android使用WebView實現離線閱讀功能

瀏覽:4日期:2022-09-19 14:58:17
1、先看效果圖,加載動畫:

Android使用WebView實現離線閱讀功能

加載完成,注意當前為飛行模式!

Android使用WebView實現離線閱讀功能

2、使用

1)、讓你的javabean實現OffLineLevelItem接口,因為我的這個離線閱讀支持多級下載,比如Demo中的每個頻道下面的第一頁item都可以緩存。

package com.zgh.offlinereader;import java.util.List;public interface OffLineLevelItem { //是否有下一級 boolean haveNextLevel(); //內容url String getWebUrl(); //下一級的url String getNextLevelListUrl(); //生成下一級 List<OffLineLevelItem> getNextLevelList(String jsonStr);}public class Channel implements OffLineLevelItem { String title; String url; public String getTitle() {return title; } public void setTitle(String title) {this.title = title; } public String getUrl() {return url; } public void setUrl(String url) {this.url = url; } @Override public boolean haveNextLevel() {return true; } @Override public String getWebUrl() {return null; } @Override public String getNextLevelListUrl() {return url; } @Override public List<OffLineLevelItem> getNextLevelList(String jsonStr) {List<OffLineLevelItem> items = GsonUtil.jsonToBeanList(jsonStr, NewsItem.class);return items; }}

2)、初始化

OfflineReaderServer.init(this, getCacheDir(), new MyFirstLevel(),new WaterWaveProgressUI(this));

3)、啟動

@Override public void onClick(View v) {Intent intent=new Intent(this, OfflineReaderServer.class);startService(intent); }

4)、記得在你的webview使用前調用

//設置緩存目錄 WebViewHelper.setWebViewConfig(webView);

就這么簡單!

實現

首先我們為什么要使用webview實現離線閱讀,因為簡單。webview自帶的緩存機制可以實現圖片,js,css的緩存。不然你自己得實現數據庫,html下載,js下載,css保存,html的拼裝。下面我將講解一些webview設置緩存,實現多級下載,webview遍歷url,webview顯示完成監聽。

1.WebView設置緩存

這一部分比較簡單,主要是緩存目錄的設置,然后設置緩存模式為:

WebSettings.LOAD_CACHE_ELSE_NETWORK

這種模式下webview會優先加載本地緩存,如果沒有緩存的話再加載網絡。

mWebView.getSettings().setRenderPriority(WebSettings.RenderPriority.HIGH);// 建議緩存策略為,判斷是否有網絡,有的話,使用LOAD_DEFAULT,無網絡時,使用LOAD_CACHE_ELSE_NETWORKmWebView.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;String cacheDirPath = ConfigUtil.getCacheDir()+ APP_CACHE_DIRNAME;Log.i(TAG, 'cachePath=' + cacheDirPath);// 設置數據庫緩存路徑mWebView.getSettings().setDatabasePath(cacheDirPath); // API 19 deprecated// 設置Application caches緩存目錄mWebView.getSettings().setAppCachePath(cacheDirPath);// 開啟Application Cache功能mWebView.getSettings().setAppCacheEnabled(true);mWebView.getSettings().setAppCacheMaxSize(MAX_SIZE);

2.多級緩存

我的項目中需要將每個頻道的首頁中的每個item都緩存下來,所以涉及到多級緩存于是我設計了一個接口在離線閱讀的時候最重要的是拿到葉子節點也就是每個item的url地址,如果是每葉子節點也就是haveNextLevel()返回true的時候就調用getNextLevelListUrl獲取下一級的url,一般都是Jason字符串,再把json字符串傳入getNextLevelList()方法獲取下一級,如果到達葉子節點,則調用getWebUrl()獲取url地址保存在一個集合中,當所有的url都獲取以后,就開始用webview遍歷url實現緩存。

public interface OffLineLevelItem { //是否有下一級 boolean haveNextLevel(); //內容url String getWebUrl(); //下一級的url String getNextLevelListUrl(); //生成下一級 List<OffLineLevelItem> getNextLevelList(String jsonStr);}

頻道的javabean

public class Channel implements OffLineLevelItem { String title; String url; public String getTitle() {return title; } public void setTitle(String title) {this.title = title; } public String getUrl() {return url; } public void setUrl(String url) {this.url = url; } @Override public boolean haveNextLevel() {return true; } @Override public String getWebUrl() {return null; } @Override public String getNextLevelListUrl() {return url; } @Override public List<OffLineLevelItem> getNextLevelList(String jsonStr) {List<OffLineLevelItem> items = GsonUtil.jsonToBeanList(jsonStr, NewsItem.class);return items; }}

item的javabean

public class NewsItem implements OffLineLevelItem{ String title; String url; public String getTitle() {return title; } public void setTitle(String title) {this.title = title; } public String getUrl() {return url; } public void setUrl(String url) {this.url = url; } @Override public String toString() {return title; } @Override public boolean haveNextLevel() {return false; } @Override public String getWebUrl() {return url; } @Override public String getNextLevelListUrl() {return null; } @Override public List<OffLineLevelItem> getNextLevelList(String jsonStr) {return null; }}

當然為了獲取到頻道列表需要一個第一級的目錄,而這個目錄在初始化的時候就設置進去了。

public class MyFirstLevel implements OffLineLevelItem { @Override public boolean haveNextLevel() {return true; } @Override public String getWebUrl() {return null; } @Override public String getNextLevelListUrl() {return 'raw://news_list'; } @Override public List<OffLineLevelItem> getNextLevelList(String jsonStr) {List<OffLineLevelItem> items = GsonUtil.jsonToBeanList(jsonStr, Channel.class);return items; }}

3.使用WebView遍歷URL,我原來的思路是給webview設置WebViewClient然后重寫onPageFinished方法,在這個方法中獲取下一個需要換成的url,然后再調用webview.loadurl()結果是很多頁面加載出來是空的。而且在Android4.4以上onPageFinished會調用兩次

Android使用WebView實現離線閱讀功能

于是乎,我重寫了WebView的OnDraw()方法,在OnDraw()方法里設置了一個監聽回調,但是由于我的WebView是在Service中創建的所以ondraw方法根本不會調用,但是這難得的我嗎?,呵呵,于是我在service的onCreat方法中使用WindowManger將webview添加到屏幕,長寬都是一個像素

@Override public void onCreate() {super.onCreate();if (!haveInit) { throw new RuntimeException('請先調用init()方法,初始化OfflineReaderServer');}windowManager = (WindowManager) getSystemService(Context.WINDOW_SERVICE);params=new WindowManager.LayoutParams();params.type = WindowManager.LayoutParams.TYPE_TOAST;params.flags = WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL| WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE;params.gravity = Gravity.LEFT | Gravity.TOP;params.width = 1;params.height = 1;initWebView();windowManager.addView(mWebView,params); }

結果還是很明顯的大部分的頁面都能緩存下來,但是任然有部分頁面是空白的,后來發現webview的OnDraw()方法會多次持續,webview的頁面加載時間隙的,我通過getContentHeight()判斷內容高度來實現顯示完成的監聽,結果任然不理想。于是我最終版是這樣的

/** * 可以監聽顯示完成的webview */public class LoadWebView extends WebView { private boolean isRendered = false; private static final int MSG_FINISH=1; private static final int MIN_CONTENT_HEIGHT=1000; public LoadWebView(Context context) {this(context, null); } public LoadWebView(Context context, AttributeSet attrs) {super(context, attrs); } private int contentHeight=MIN_CONTENT_HEIGHT; Handler handler=new Handler(Looper.getMainLooper()){@Overridepublic void handleMessage(Message msg) { if(msg.what==MSG_FINISH) {if (finishListenter != null) { finishListenter.onFinish(); contentHeight=MIN_CONTENT_HEIGHT;} }} }; @Override protected void onDraw(Canvas canvas) {//與上一次的contentHeight比較,如果比上一次大,說明還在加載if(getContentHeight()>=contentHeight){ //更新contentHeight contentHeight=getContentHeight(); //取消消息 handler.removeMessages(MSG_FINISH); //延遲200ms發送,如果在200ms內webview又加載了則這條消息會被取消,知道webview加載完成, //這條消息會被發送,所以每離線一個頁面有200ms的延遲,但是與功能相比這點是可以接受的。 handler.sendEmptyMessageDelayed(MSG_FINISH,200);} } public interface OnLoadFinishListenter{void onFinish(); } private OnLoadFinishListenter finishListenter; public void setFinishListenter(OnLoadFinishListenter listenter){finishListenter=listenter; }}3、進度提示

為了讓用戶知道離線的進度我抽取出了一個接口

public interface OffLineProgressUI { void showProgress(); void closeProgress(); void updateProgress(int progress);}

并默認實現了一個水波紋的進度球

Android使用WebView實現離線閱讀功能

設置進度提示有兩種方式,一種是在初始化的時候設置

OfflineReaderServer.init(this, getCacheDir(), new MyFirstLevel(),new WaterWaveProgressUI(this));

還有一種是調用OfflineReaderServer的setProgressUI方法

public static void setProgressUI(@NonNull OffLineProgressUI progressUI) {sProgressUI = progressUI; }

源碼地址:

https://github.com/zhuguohui/OffLineReaderDem

以上就是Android使用WebView實現離線閱讀功能的詳細內容,更多關于Android 實現離線閱讀功能的資料請關注好吧啦網其它相關文章!

標簽: Android
相關文章:
主站蜘蛛池模板: 企业彩铃制作_移动、联通、电信集团彩铃上传开通_彩铃定制_商务彩铃管理平台-集团彩铃网 | 校服厂家,英伦校服定做工厂,园服生产定制厂商-东莞市艾咪天使校服 | 风电变桨伺服驱动器-风电偏航变桨系统-深圳众城卓越科技有限公司 | 泵阀展|阀门展|水泵展|流体机械展 -2025上海国际泵管阀展览会flowtech china | 气象监测系统_气象传感器_微型气象仪_气象环境监测仪-山东风途物联网 | 佛山市钱丰金属不锈钢蜂窝板定制厂家|不锈钢装饰线条|不锈钢屏风| 电梯装饰板|不锈钢蜂窝板不锈钢工艺板材厂家佛山市钱丰金属制品有限公司 | 123悬赏网_发布悬赏任务_广告任务平台 | 加气混凝土砌块设备,轻质砖设备,蒸养砖设备,新型墙体设备-河南省杜甫机械制造有限公司 | 哈尔滨京科脑康神经内科医院-哈尔滨治疗头痛医院-哈尔滨治疗癫痫康复医院 | 垃圾处理设备_餐厨垃圾处理设备_厨余垃圾处理设备_果蔬垃圾处理设备-深圳市三盛环保科技有限公司 | 南京雕塑制作厂家-不锈钢雕塑制作-玻璃钢雕塑制作-先登雕塑厂 | 冷油器,取样冷却器,热力除氧器-连云港振辉机械设备有限公司 | 德国GMN轴承,GMN角接触球轴承,GMN单向轴承,GMN油封,GMN非接触式密封 | 上海刑事律师|刑事辩护律师|专业刑事犯罪辩护律师免费咨询-[尤辰荣]金牌上海刑事律师团队 | 防爆电机_ybx3系列电机_河南省南洋防爆电机有限公司 | 抓斗式清污机|螺杆式|卷扬式启闭机|底轴驱动钢坝|污水处理闸门-方源水利机械 | 京港视通报道-质量走进大江南北-京港视通传媒[北京]有限公司 | 微动开关厂家-东莞市德沃电子科技有限公司 | 聚合氯化铝_喷雾聚氯化铝_聚合氯化铝铁厂家_郑州亿升化工有限公司 | 视频教程导航网_视频教程之家_视频教程大全_最新视频教程分享发布平台 | 粘弹体防腐胶带,聚丙烯防腐胶带-全民塑胶 | 百度爱采购运营研究社社群-店铺托管-爱采购代运营-良言多米网络公司 | 杭州用友|用友软件|用友财务软件|用友ERP系统--杭州协友软件官网 | 航空障碍灯_高中低光强航空障碍灯_民航许可认证航空警示灯厂家-东莞市天翔航天科技有限公司 | 圣才学习网-考研考证学习平台,提供万种考研考证电子书、题库、视频课程等考试资料 | CE认证_产品欧盟ROHS-REACH检测机构-商通检测 | 加中寰球移民官网-美国移民公司,移民机构,移民中介,移民咨询,投资移民 | 医学模型生产厂家-显微手术模拟训练器-仿真手术模拟训练系统-北京医教科技 | SPC工作站-连杆综合检具-表盘气动量仪-内孔缺陷检测仪-杭州朗多检测仪器有限公司 | 不锈钢/气体/液体玻璃转子流量计(防腐,选型,规格)-常州天晟热工仪表有限公司【官网】 | 岛津二手液相色谱仪,岛津10A液相,安捷伦二手液相,安捷伦1100液相-杭州森尼欧科学仪器有限公司 | 德国GMN轴承,GMN角接触球轴承,GMN单向轴承,GMN油封,GMN非接触式密封 | 必胜高考网_全国高考备考和志愿填报信息平台 | 电杆荷载挠度测试仪-电杆荷载位移-管桩测试仪-北京绿野创能机电设备有限公司 | 行业分析:提及郑州火车站附近真有 特殊按摩 ?2025实地踩坑指南 新手如何避坑不踩雷 | 管家婆-管家婆软件-管家婆辉煌-管家婆进销存-管家婆工贸ERP | 挤塑板-XPS挤塑板-挤塑板设备厂家[襄阳欧格] | 广州办公室设计,办公室装修,写字楼设计,办公室装修公司_德科 | 济南菜鸟驿站广告|青岛快递车车体|社区媒体-抖音|墙体广告-山东揽胜广告传媒有限公司 | 元拓建材集团官方网站| 煤矿支护网片_矿用勾花菱形网_缝管式_管缝式锚杆-邯郸市永年区志涛工矿配件有限公司 |