- 自定义阅读视图:
io.legado.app.ui.book.read.page.ReadView- 有prePage、curPage、nextPage
- 从
io.legado.app.ui.book.read.page.provider.TextPageFactory中获取
- 从
- upContent:更新以上3个Page
io.legado.app.model.ReadBook:当前阅读书籍、章节、页面等信息- loadContent:
io.legado.app.help.book.BookHelp#getContent:本地获取- download:爬虫
io.legado.app.model.CacheBook#getOrCreate(BookSource, Book)io.legado.app.model.CacheBook.CacheBookModel#download(CoroutineScope, BookChapter, boolean)io.legado.app.model.webBook.WebBook#getContent- 异步解析规则、根据规则爬取数据,保存数据(文字,图片)
io.legado.app.model.CacheBook.CacheBookModel#downloadFinishio.legado.app.model.ReadBook#contentLoadFinish-
`io.legado.app.ui.book.read.page.provider.ChapterProvider#getTextChapter`- 获取TextChapter,且创建所有TextPage、TextLine、BaseColumn
- 异步处理数据,且初始化ReadBook,且调用回调对象
io.legado.app.model.ReadBook.callBack- 就是
io.legado.app.ui.book.read.ReadBookActivity - 即进行把"加载中"页面更新为用当前获取的数据创建的页面
-
- loadContent:
- 有prePage、curPage、nextPage
- 一页视图
io.legado.app.ui.book.read.page.PageView- 涉及数据对象:
io.legado.app.ui.book.read.page.entities.TextChapterio.legado.app.ui.book.read.page.entities.TextPageio.legado.app.ui.book.read.page.entities.TextLineio.legado.app.ui.book.read.page.entities.column.BaseColumn- .....
- 滚动页面只需要一页,即curPage,每次都是更新curPage的content
- 涉及数据对象:
- 内容部分
io.legado.app.ui.book.read.page.ContentTextView- 在
View#onDraw(android.graphics.Canvas)方法中使用Canvas进行drawPage,对TextPage中每个TextLine的columns进行draw - 重新设置:setContent,最后invalidate使当前失效,重新draw
- 在
- 写完才发现,截至2024/6/24,官方已经做出像样的异步加载网络图片了
- 区别:
- 人家:重写了UI,使得按顺序一张一张地加载图片
- 我:仍然是加载全部,但是如果还未下载完的显示加载错误图片,需要等待下载完再触摸一下更新UI
- 区别:
- 把
io.legado.app.model.CacheBook.CacheBookModel#download(kotlinx.coroutines.CoroutineScope, io.legado.app.data.entities.BookChapter, boolean)中的变成异步WebBook.getContent中的最后一步BookHelp.saveContent与downloadFinish的ReadBook#contentLoadFinish变成异步,不要保存、下载完数据后才contentLoadFinishBookHelp.saveContent只针对saveImages进行优化
- 方法:只修改一处即可,让
io.legado.app.help.book.BookHelp#saveImages变成异步的,而不是只是有一个异步流(需要等待该异步流完成才能继续执行)io.legado.app.ui.book.read.page.provider.ChapterProvider#getTextChapter需要获取图片的size,如果没有该图片会进行下载,因此添加参数anyImageSize=true,获取任意一张的大小
- 问题
- get null 怎么办?
- 根据
io.legado.app.ui.book.read.page.provider.TextPageFactory#getCurPage,可知是一个"加载中"页面 - 因此不太担心划太多超时当前拥有的范围
- 根据
- 中途发生错误 怎么办,需要额外逻辑吗?完成下载呢?
- 照抄
io.legado.app.model.CacheBook.CacheBookModel#download(kotlinx.coroutines.CoroutineScope, io.legado.app.data.entities.BookChapter, boolean)- 其中
onFinallypostEvent(EventBus.UP_DOWNLOAD, book.bookUrl)- 好像是更新缓存页面的状态,但是好像没改什么
onError:下载失败在下载那里有处理异常,不需要onCancel:由于在onSuccess就已经onDownloadSet.remove,只是还有if (!isStopped) waitDownloadSet.add(index),不过感觉可以忽视,不用管
- 其中
- 因此不需要额外逻辑
- 照抄
- 退出阅读界面后仍然在下载怎么办?
- 解决方法:异步的
io.legado.app.help.book.BookHelp#saveImages使用ReadBook.downloadScope(从源头loadContent看见给的,当退出阅读界面时,会使用该scope进行取消,从而取消下载)
- 解决方法:异步的
- 在阅读界面退出重新进入,不会继续下载或者重新下载图片
- 感觉理所当然不应该重新下载,而是需要刷新,刷新不会重新下载所有,而是下载未下载的(官方本来就是这样写的)
- get null 怎么办?