欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

Android使用WebView实现离线阅读功能

程序员文章站 2022-09-03 18:21:27
1、先看效果图,加载动画:加载完成,注意当前为飞行模式!2、使用1)、让你的javabean实现offlinelevelitem接口,因为我的这个离线阅读支持多级下载,比如demo中的每个频道下面的第...

1、先看效果图,加载动画:

Android使用WebView实现离线阅读功能

加载完成,注意当前为飞行模式!

Android使用WebView实现离线阅读功能

2、使用

1)、让你的javabean实现offlinelevelitem接口,因为我的这个离线阅读支持多级下载,比如demo中的每个频道下面的第一页item都可以缓存。

2)、初始化

3)、启动

4)、记得在你的webview使用前调用

就这么简单!

实现

首先我们为什么要使用webview实现离线阅读,因为简单。webview自带的缓存机制可以实现图片,js,css的缓存。不然你自己得实现数据库,html下载,js下载,css保存,html的拼装。下面我将讲解一些webview设置缓存,实现多级下载,webview遍历url,webview显示完成监听。

1.webview设置缓存

这一部分比较简单,主要是缓存目录的设置,然后设置缓存模式为:

这种模式下webview会优先加载本地缓存,如果没有缓存的话再加载网络。

2.多级缓存

我的项目中需要将每个频道的首页中的每个item都缓存下来,所以涉及到多级缓存于是我设计了一个接口在离线阅读的时候最重要的是拿到叶子节点也就是每个item的url地址,如果是每叶子节点也就是havenextlevel()返回true的时候就调用getnextlevellisturl获取下一级的url,一般都是jason字符串,再把json字符串传入getnextlevellist()方法获取下一级,如果到达叶子节点,则调用getweburl()获取url地址保存在一个集合中,当所有的url都获取以后,就开始用webview遍历url实现缓存。

频道的javabean

item的javabean

当然为了获取到频道列表需要一个第一级的目录,而这个目录在初始化的时候就设置进去了。

3.使用webview遍历url,我原来的思路是给webview设置webviewclient然后重写onpagefinished方法,在这个方法中获取下一个需要换成的url,然后再调用webview.loadurl()结果是很多页面加载出来是空的。而且在android4.4以上onpagefinished会调用两次

Android使用WebView实现离线阅读功能

于是乎,我重写了webview的ondraw()方法,在ondraw()方法里设置了一个监听回调,但是由于我的webview是在service中创建的所以ondraw方法根本不会调用,但是这难得的我吗?,呵呵,于是我在service的oncreat方法中使用windowmanger将webview添加到屏幕,长宽都是一个像素

结果还是很明显的大部分的页面都能缓存下来,但是任然有部分页面是空白的,后来发现webview的ondraw()方法会多次持续,webview的页面加载时间隙的,我通过getcontentheight()判断内容高度来实现显示完成的监听,结果任然不理想。于是我最终版是这样的

3、进度提示

为了让用户知道离线的进度我抽取出了一个接口

并默认实现了一个水波纹的进度球

Android使用WebView实现离线阅读功能

设置进度提示有两种方式,一种是在初始化的时候设置

还有一种是调用offlinereaderserver的setprogressui方法

源码地址:

https://github.com/zhuguohui/offlinereaderdem

以上就是android使用webview实现离线阅读功能的详细内容,更多关于android 实现离线阅读功能的资料请关注其它相关文章!