成人在线亚洲_国产日韩视频一区二区三区_久久久国产精品_99国内精品久久久久久久

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

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

瀏覽:7日期: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
相關文章:
成人在线亚洲_国产日韩视频一区二区三区_久久久国产精品_99国内精品久久久久久久
国产另类ts人妖一区二区| 亚洲看片一区| 国产成人亚洲综合a∨婷婷| 亚洲欧美精品| 亚洲免费观看| 欧美一级播放| 日本韩国欧美三级| 欧美日韩中文国产| 欧美一级夜夜爽| 欧美电影免费观看高清完整版 | 欧美日韩爆操| 一本综合久久| 在线观看一区不卡| 欧美精品欧美精品系列| 日韩一卡二卡三卡| 日本一区二区三区国色天香| 1024成人网| 亚洲成a人片综合在线| 美女视频免费一区| 国产成人免费视频| 欧美在线国产| 国产欧美日韩综合一区在线观看 | 国产校园另类小说区| 亚洲丝袜自拍清纯另类| 午夜欧美一区二区三区在线播放| 日本成人在线看| 国产 日韩 欧美大片| 色综合夜色一区| 国产亚洲一区在线| 在线观看网站黄不卡| 精品久久人人做人人爰| 亚洲视频一区在线| 日本欧美韩国一区三区| 高清成人在线观看| 亚洲福利专区| 欧美日韩午夜精品| 久久久国产精品麻豆| 亚洲成a人片综合在线| 成人激情开心网| 亚洲激情综合| 欧美日韩国产精品成人| 国产精品青草久久| 青青草97国产精品免费观看| 成人精品视频一区| 国产精品日韩一区二区| 日韩视频中午一区| 亚洲蜜桃精久久久久久久| 狠狠色狠狠色综合系列| 欧美日韩免费精品| 欧美日韩午夜精品| 亚洲免费资源在线播放| 国产黄人亚洲片| 国产欧美亚洲一区| 久久综合精品国产一区二区三区 | 成人动漫一区二区| 蜜桃av久久久亚洲精品| 国产亚洲综合性久久久影院| 婷婷久久综合九色综合绿巨人| 91丨九色丨国产丨porny| 日本高清不卡视频| 中文字幕日本不卡| 成人深夜在线观看| 91福利视频在线| 亚洲区小说区图片区qvod| 成人在线视频首页| 91成人网在线| 亚洲欧美一区二区久久 | 欧美日韩精品一区视频| 一区二区欧美精品| 色综合天天综合网天天看片| 欧美三级视频在线| 亚洲成人资源在线| 黑人一区二区| 国产校园另类小说区| 成人午夜免费电影| 欧美日免费三级在线| 亚洲一二三四在线观看| 亚洲视频一二| 国产精品系列在线| 91婷婷韩国欧美一区二区| 欧美一级二级三级蜜桃| 日产国产高清一区二区三区 | 国产日韩欧美不卡在线| 丁香婷婷综合色啪| 欧美日韩国产精品自在自线| 日本欧美肥老太交大片| 免费h精品视频在线播放| 亚洲裸体在线观看| 136国产福利精品导航网址| 国产日韩欧美一区二区三区综合| 成人免费毛片app| 欧美一卡二卡三卡四卡| 国产专区综合网| 欧美少妇一区二区| 麻豆精品蜜桃视频网站| 欧美亚洲自拍偷拍| 久久精品免费观看| 欧美日韩电影在线播放| 国内精品在线播放| 欧美专区日韩专区| 久久国产尿小便嘘嘘| 欧美日韩国产综合视频在线观看| 美腿丝袜亚洲色图| 欧美日韩成人高清| 成熟亚洲日本毛茸茸凸凹| 91精品国产综合久久香蕉麻豆| 国产精品66部| 国产午夜精品一区二区三区嫩草| 91香蕉视频污| 亚洲欧美国产三级| 国产乱人伦精品一区二区| 亚洲va天堂va国产va久| 在线视频综合导航| 国产精品一区久久久久| 精品国产乱码久久久久久老虎| av不卡免费在线观看| 欧美韩国日本一区| 亚洲最新在线| 日本欧美久久久久免费播放网| 欧美手机在线视频| www.综合网.com| 国产精品毛片久久久久久| 99在线热播精品免费99热| 亚瑟在线精品视频| 欧美日韩一区高清| 99久久er热在这里只有精品66| 国产偷v国产偷v亚洲高清| 精品69视频一区二区三区Q| 亚洲一区二区三区免费视频| 欧美视频自拍偷拍| thepron国产精品| 亚洲卡通动漫在线| 欧美日韩亚洲综合在线 | 奇米四色…亚洲| 精品国产乱码久久久久久老虎 | 在线视频欧美一区| 国产一区 二区| 久久婷婷丁香| 国产一区二区不卡| 久久嫩草精品久久久久| 亚洲永久免费| 国产不卡在线视频| 亚洲日本在线a| 91精品国产入口在线| 国产综合18久久久久久| 蜜臀va亚洲va欧美va天堂| 精品99999| 久久男女视频| 欧美特黄视频| 蜜臀久久99精品久久久久久9| 久久久91精品国产一区二区精品| 国产美女精品| 99久久久精品| 青青草国产成人av片免费| 中文字幕不卡在线观看| 欧美特级限制片免费在线观看| 国产一区激情| 国产麻豆一精品一av一免费| 亚洲三级在线免费| 91麻豆精品91久久久久久清纯| 一区二区三区欧美在线| 成人在线综合网| 毛片一区二区三区| 一区二区三区四区高清精品免费观看 | 日本午夜精品视频在线观看| 久久精品亚洲国产奇米99| 欧美中文一区二区三区| 亚洲九九精品| 91在线小视频| 国产精品18久久久久久久久| 日韩精品乱码av一区二区| 国产精品日产欧美久久久久| 欧美视频三区在线播放| 一本色道久久| 欧美破处大片在线视频| 国产v日产∨综合v精品视频| 日韩精品视频网站| 亚洲精品免费在线观看| 国产亚洲欧美日韩在线一区| 欧美日韩精品久久久| 久久国产欧美精品| 亚洲国产美女| 欧美人与禽性xxxxx杂性| 波多野结衣亚洲| 国产成人av电影在线观看| 美女任你摸久久| 香蕉成人伊视频在线观看| 亚洲精品美腿丝袜| 国产精品不卡一区二区三区| 国产午夜三级一区二区三| 精品国产污污免费网站入口 | 韩国精品一区二区| 人禽交欧美网站| 五月天一区二区| 午夜精品福利一区二区三区av | 亚洲裸体xxx| 亚洲综合视频在线观看| 亚洲综合激情小说| 亚洲综合区在线| 亚洲丶国产丶欧美一区二区三区|