成人在线亚洲_国产日韩视频一区二区三区_久久久国产精品_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国内精品久久久久久久
欧美大尺度电影在线| 亚洲一区在线电影| 中文字幕av资源一区| 国产尤物一区二区在线| 一本色道久久综合亚洲91| 亚洲美腿欧美偷拍| caoporn国产一区二区| 91精品国产入口在线| 国产一区二区影院| 欧美高清视频一二三区| 久久超级碰视频| 欧美在线高清视频| 美国三级日本三级久久99 | 精品一区二区免费| 在线观看一区日韩| 蜜桃视频一区二区三区| 久久国产精品久久精品国产| 国产精品狼人久久影院观看方式| 国产成人精品亚洲777人妖| 在线播放亚洲一区| 国产福利一区在线| 日韩一区二区三区在线视频| 国产v综合v亚洲欧| 日韩美女视频在线| 91丨porny丨户外露出| 国产人久久人人人人爽| 欧美极品一区| 中文字幕一区二区三区视频| 国自产拍偷拍福利精品免费一 | 在线亚洲精品| 夜夜揉揉日日人人青青一国产精品 | 久久综合久久综合久久| 91亚洲资源网| 亚洲国产高清aⅴ视频| 亚洲性视频h| 一区二区三区小说| 久久国产精品亚洲va麻豆| 天堂成人国产精品一区| 91久久精品国产91性色tv| 蜜臀久久久久久久| 欧美精品免费视频| 丁香五精品蜜臀久久久久99网站| 欧美一区二区三区白人| 99精品桃花视频在线观看| 国产欧美日韩视频一区二区| 欧美日韩国产色综合一二三四| 综合亚洲深深色噜噜狠狠网站| 国产精品久久久久久久久久妞妞 | 亚洲国产精品影院| 色噜噜狠狠一区二区三区果冻| 久久国产精品免费| 欧美岛国在线观看| 欧美精品一区二区视频 | 色综合一区二区| 自拍偷拍亚洲激情| 久久男女视频| 国产精品一级在线| 国产人成一区二区三区影院| 亚洲国产精品久久久久婷婷老年| 亚洲国产精品影院| 在线播放国产精品二区一二区四区| 福利一区二区在线| 国产精品女人毛片| 男人的天堂成人在线| 九九视频精品免费| 久久免费电影网| 欧美女激情福利| 午夜精品久久一牛影视| 337p亚洲精品色噜噜噜| 欧美日韩免费精品| 午夜精品视频一区| 日韩视频一区在线观看| 亚洲国产精品久久久久婷婷老年| 日韩制服丝袜av| 日韩欧美亚洲国产精品字幕久久久| 欧美午夜在线视频| 日本中文字幕一区二区有限公司| 欧美一级在线视频| 亚洲图色在线| 免费高清在线视频一区·| 欧美肥妇free| 97精品视频在线观看自产线路二 | 国内成人精品2018免费看| 久久综合av免费| 国产精品毛片va一区二区三区| 国产一区二区在线影院| 国产精品国产三级国产| 欧美系列亚洲系列| 欧美日韩精品一本二本三本| 三级不卡在线观看| 久久免费视频一区| 久久久久欧美| av网站免费线看精品| 亚洲成a人v欧美综合天堂下载| 日韩欧美国产电影| 亚洲欧美网站| 91在线视频网址| 免费成人深夜小野草| 国产精品麻豆网站| 精品视频在线视频| 亚洲激情网站| 成人免费视频app| 午夜欧美电影在线观看| 欧美精品一区二区三区高清aⅴ| 久久久久高清| 欧美精品尤物在线| 国产麻豆视频一区二区| 一区二区三区日韩欧美| 欧美xxxx老人做受| 久久久久久久欧美精品| 欧美激情一区| 国产精品一二三四区| 亚洲午夜久久久久| 久久久高清一区二区三区| 欧美亚洲自拍偷拍| 亚洲精华国产欧美| 成人精品电影在线观看| 亚洲国产毛片aaaaa无费看| 国产日韩欧美在线一区| 7777精品伊人久久久大香线蕉经典版下载| 一区二区三区四区五区精品| 成人黄色av电影| 蜜臀99久久精品久久久久久软件| 亚洲欧洲精品一区二区精品久久久| 日韩一区二区三免费高清| 久久久久一区二区| 黑人一区二区三区四区五区| 丁香另类激情小说| 蜜臀久久99精品久久久久久9| 一区二区三区精品在线| 久久亚洲精品国产精品紫薇| 欧美日韩精品是欧美日韩精品| 亚洲欧美日韩精品久久久 | 91在线视频在线| 国产精品一二三区在线| 日韩国产精品久久久| 亚洲精品美国一| 欧美激情一区在线观看| 欧美特级限制片免费在线观看| 亚洲日本精品国产第一区| 欧美高清一区| av不卡在线观看| 国内精品免费在线观看| 视频一区欧美精品| 亚洲女人小视频在线观看| 国产性做久久久久久| 日韩欧美一级二级| 欧美精品在线视频| 在线免费观看成人短视频| 国产精品一区二区三区四区五区 | 精品不卡视频| 99久久er热在这里只有精品15| 国产精品影视网| 另类综合日韩欧美亚洲| 日韩成人一级片| 亚洲成av人片在www色猫咪| 一区二区在线观看不卡| 亚洲欧美自拍偷拍色图| 久久久精品2019中文字幕之3| 精品久久人人做人人爽| 日韩无一区二区| 欧美精品九九99久久| 欧美性欧美巨大黑白大战| 日本精品一级二级| 色老头久久综合| 狂野欧美一区| 国产欧美亚洲日本| 亚洲日本欧美在线| 在线观看一区| 亚洲国产高清一区二区三区| 影音先锋亚洲电影| 亚洲第一黄网| 亚洲第一伊人| 99热这里只有精品8| 中文日韩欧美| 羞羞答答国产精品www一本| 亚洲免费一区二区| 麻豆精品91| 在线视频观看一区| 欧美视频三区在线播放| 欧美人与禽zozo性伦| 久久亚洲不卡| 欧美在线播放高清精品| 欧美色涩在线第一页| 欧美丰满一区二区免费视频| 91精品国产综合久久久久久漫画| 这里只有精品99re| 日韩欧美精品在线视频| 精品久久99ma| 久久先锋影音av| 中文一区一区三区高中清不卡| 国产精品久线在线观看| 亚洲视频精选在线| 亚洲综合清纯丝袜自拍| 亚洲成a人在线观看| 久久精品国产第一区二区三区 | 欧美日韩三级电影在线| 在线看无码的免费网站| 在线天堂一区av电影| 色悠悠亚洲一区二区|