日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区

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

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

瀏覽:28日期: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
相關文章:
日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区
日本精品黄色| 成人污污视频| 国精品一区二区三区| 欧美一区精品| 久久久久久久欧美精品| 日韩中文字幕| 亚洲一区二区日韩| 亚洲黑丝一区二区| 欧美日韩水蜜桃| 午夜精品一区二区三区国产| 中国女人久久久| 国产精品av久久久久久麻豆网| 国产精品二区影院| 亚洲国产福利| 中文字幕乱码亚洲无线精品一区| 久久久久亚洲精品中文字幕| 久久精品国产久精国产| 在线视频观看日韩| 黑丝一区二区三区| 亚洲精品极品少妇16p| 日韩精品网站| 国产91在线精品| 午夜久久久久| 你懂的亚洲视频| 国产精品视频一区二区三区综合| 国产精品美女久久久浪潮软件| 香蕉视频成人在线观看| 欧美福利在线| 丝袜脚交一区二区| 欧美影院视频| 国产在线视频欧美一区| 激情欧美国产欧美| 中文字幕亚洲影视| 国产精品久久久久77777丨| 欧美xxxx中国| 亚洲激情av| 欧美久久一区二区三区| 国产在线一区不卡| 亚洲精品97| 国产精品任我爽爆在线播放| 日韩美女一区二区三区在线观看| 天堂网在线观看国产精品| 97久久精品| 亚洲91久久| 日韩av在线播放网址| 日韩精品免费观看视频| 999国产精品| 精品黄色一级片| 日韩av一区二区在线影视| 日本欧美不卡| 欧美1区免费| 日韩专区在线视频| 国产精品久久久久久久久久久久久久久| 欧美日韩国产精品一区二区亚洲| 国产精品腿扒开做爽爽爽挤奶网站| 国产乱码精品一区二区三区四区| 欧美不卡高清一区二区三区| 精品91久久久久| 国产乱论精品| 中文一区在线| 国产一区二区三区四区| 在线视频亚洲欧美中文| 国产不卡一区| 午夜一级在线看亚洲| 精品三级av| 亚洲深深色噜噜狠狠爱网站| 91一区二区| 日韩高清一区二区| 久久久久99| 国产亚洲高清一区| 99国产精品视频免费观看一公开| 国产精品hd| 亚洲神马久久| 国产一区一一区高清不卡| 亚洲精品黄色| 国产一区不卡| 日韩中文字幕1| 一区二区国产在线观看| 久久婷婷av| 国产精品97| 97精品国产一区二区三区| 免费日韩av| 美女日韩在线中文字幕| 香蕉成人av| 91精品推荐| 欧美国产亚洲精品| 精品久久国产一区| 三级在线观看一区二区| 亚洲欧美日韩一区在线观看| 亚洲精品**中文毛片| 午夜日韩在线| 日韩精品免费观看视频| 国产成人77亚洲精品www| 国产精品久久久久久妇女| 欧美激情91| 久久理论电影| 日韩精品一区二区三区免费观看| 国产欧美日韩一区二区三区四区| 麻豆精品av| 91国内精品| 国产在线观看www| 亚洲免费资源| 91欧美在线| 精品黄色一级片| 精品视频高潮| 五月亚洲婷婷 | 日韩精品免费一区二区三区| 久久狠狠久久| 激情欧美日韩一区| 一区在线免费| 久久亚洲人体| 视频精品一区| 视频一区日韩精品| 中文无码日韩欧| 国产精品黑丝在线播放| 免费一区二区视频| av综合电影网站| 久久精品999| 亚洲国产日韩欧美在线| 国际精品欧美精品| 四虎国产精品免费观看| 国产精品麻豆久久| 日韩av一级| 麻豆久久久久久久| 日韩二区三区四区| 亚洲一二av| 精品国产91| 国产成人精品三级高清久久91 | 亚洲网址在线观看| 蜜芽一区二区三区| 精品伊人久久| 午夜久久美女| 亚洲精品激情| 美国三级日本三级久久99| 欧美一区二区三区久久精品| 综合干狼人综合首页| 亚洲欧美久久精品| 欧美一区精品| 久久精品一区二区国产| 国产96在线亚洲| 久久精品免费看| 亚洲精品在线影院| 在线精品小视频| 国产亚洲亚洲| 日韩不卡免费视频| 精品国产精品久久一区免费式| 中文字幕在线视频久| 欧美丝袜一区| 久久高清免费观看| 日本欧美一区| 91日韩免费| 丝袜av一区| 亚洲免费观看| 亚洲综合中文| 国产精品亚洲欧美一级在线| 国产精品欧美日韩一区| 精品中文在线| 精品一区三区| 免费视频最近日韩| 欧美激情视频一区二区三区在线播放| 92国产精品| 日韩一区欧美二区| 久久久久亚洲精品中文字幕| 久久精品99久久无色码中文字幕| 久久国产高清| 国产精品香蕉| 日本国产精品| 老牛影视一区二区三区| 国产精品美女午夜爽爽| 亚洲a一区二区三区| 综合激情网...| 精品女同一区二区三区在线观看| 久久国产精品成人免费观看的软件| 综合激情在线| 9999国产精品| 亚洲天堂日韩在线| 国产在线看片免费视频在线观看| 香蕉视频成人在线观看| 久久精品国内一区二区三区| 在线亚洲一区| 在线亚洲观看| 国产一区二区三区四区| 先锋亚洲精品| 激情久久99| 国产精品福利在线观看播放| 中文字幕人成乱码在线观看| 久久五月天小说| 在线看片日韩| 久久一区二区三区电影| 亚洲欧美一区在线| 国产精品一区2区3区| 日韩一区欧美二区| 国产黄色一区| 亚洲激情二区| 成人午夜在线| 中文字幕一区二区精品区| 免费在线观看精品| 日韩综合小视频| 日韩av有码| 快she精品国产999|