当前位置:   article > 正文

Android_Jetpack:Paging组件之BoundaryCallback的使用_paging boundarycallback

paging boundarycallback

Paging组件除了单纯地支持网络、数据库为数据源外,还支持网络+数据库的架构方式,这就用到了BoundaryCallback。本文我们会使用PositionalDataSource方式加载数据,来简化多数据源应用的复杂度。

BoundaryCallback的使用流程如下:
在这里插入图片描述

通过流程图可知,数据库是页面的唯一数据来源:页面订阅了数据库的变化,当数据库中的数据发生变化时,会直接反映到页面上。

  • 若数据库中没有数据,会通知BoundaryCallback中得到onZeroItemsLoaded方法;若数据库中有数据,则当用户滑动到RecyclerView底部时,且数据库中的数据全部加载完毕时,会通知BoundaryCallback中的OnItemAtEndLoad方法。
  • 当BoundaryCallback中的回调方法被调用时,需要在该方法内开启工作线程请求网络数据。
  • 当网络数据成功加载回来,并不直接展示数据,而是将其写入数据库。
  • 由于已经设置好了页面对数据库的订阅,当数据库有新数据写入时,会自动更新到页面。
  • 当需要刷新数据时,可以通过页面下拉刷新功能在下拉过程中情况数据。当数据库被清空时,由于数据库发生变化,进而再次触发步骤1,通知BoundaryCallback重新获取数据。

接下来将在Android_Jetpack:Paging组件之PageKeyedDataSource的MVVM使用的基础上,使用BoundaryCallback和Room组件进行展示。

①引入依赖,创建room数据库和Model类,以及针对Model类实现对应的Dao文件,以方便对数据的增删改查。

//按照"最新笑话"定义
data class JokeResponse(val reason:String, val result:Result,@SerializedName("error_code") val errorCode :Int) {
   
    data class Result(val data:List<Joke>)
    @Entity(tableName = "joke")
    data class Joke(val content:String, val hashId:String,val unixtime:Long,val updatetime:String){
   
        @PrimaryKey(autoGenerate = true)
        var id:Long = 0
    }
}

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
@Dao
interface JokeDao {
   
    @Insert
    fun insertJokes(jokes: List<JokeResponse.Joke>)
    @Query("DELETE FROM joke")
    fun clear()
    @Query("SELECT * FROM joke")
    fun getJokeList(): DataSource.Factory<Int,JokeResponse.Joke>
}

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11

注意getJokeList()方法返回的是一个DataSource.Factory,这样就可以实现数据库的订阅。

②实现BoundaryCallback。

class JokeBoundaryCallback(private val jokeDao: JokeDao):PagedList.BoundaryCallback<JokeResponse.Joke> (){
   
    private val sharedPreferences: SharedPreferenc
  • 1
  • 2
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/知新_RL/article/detail/286454
推荐阅读
相关标签
  

闽ICP备14008679号