flo*_*-do 3 android kotlin android-paging
我试图学习如何将新的分页库与Kotlin语言一起使用已经有2天了(也是第一次)
因此,我已经阅读了许多指南/教程和Github存储库(https://github.com/STAR-ZERO/paging-retrofit-sample)来实现此分页库,基本上我的麻烦是在我的api调用之前,我的LiveData<PagedList<Discover>>内部ViewModel触发了即将结束,我不知道为什么,我觉得电话callback.onResult(it?.results.orEmpty(), null, 2)没有任何作用
我正在使用此版本android.arch.paging:runtime:1.0.1
您可以在这里找到我的项目的仓库:https : //github.com/florian-do/TMDB
logcat :
D/DataSourceFactory: : create()
D/SequentialDataSource: loadInitial:
D/Interceptor: https://api.themoviedb.org/3/discover/movie?api_key=??
D/MainFragment: : observe 0
D/SequentialDataSource: response code -> 200
D/SequentialDataSource: list size: 20
Run Code Online (Sandbox Code Playgroud)
这是我的代码:
Fragment.kt
val adapter = DiscoverAdapter(context!!, diffCallBack)
binding.rvFeed.layoutManager = GridLayoutManager(context, 3)
binding.rvFeed.setHasFixedSize(true)
binding.rvFeed.adapter = adapter
viewModel.data.observe(this, Observer {
Log.d(TAG, ": observe "+it?.size)
})
Run Code Online (Sandbox Code Playgroud)
MainViewModel.kt
class MainViewModel : ViewModel() {
var amount = ObservableField<String>()
val data : LiveData<PagedList<Discover>>
init {
val config = PagedList.Config.Builder()
.setPageSize(20)
.setEnablePlaceholders(false)
.build()
val api : DiscoverService = App.retrofit.create(DiscoverService::class.java)
val dataSourceFactory = DataSourceFactory(api)
data = LivePagedListBuilder(dataSourceFactory, config).build()
}
}
Run Code Online (Sandbox Code Playgroud)
DataSourceFactory.kt
class DataSourceFactory(api: DiscoverService) : DataSource.Factory<Int, Discover>() {
val source = SequentialDataSource(api)
override fun create(): DataSource<Int, Discover> {
return source
}
}
Run Code Online (Sandbox Code Playgroud)
SequentialDataSource.kt
class SequentialDataSource(val api : DiscoverService) : PageKeyedDataSource<Int, Discover>() {
private val TAG = "SequentialDataSource"
override fun loadInitial(params: LoadInitialParams<Int>, callback: LoadInitialCallback<Int, Discover>) {
Log.d(TAG, "loadInitial: ")
api.getDiscover(TMDBClient.API_KEY).enqueue(object : Callback<DiscoverReponse> {
override fun onFailure(call: Call<DiscoverReponse>, t: Throwable) {
Log.d(TAG, ": FAIL")
}
override fun onResponse(call: Call<DiscoverReponse>, response: Response<DiscoverReponse>) {
Log.d(TAG, ": response code -> "+response.code())
val it = response.body();
Log.d(TAG, "list size: "+it?.results?.size)
response.body()?.let {
callback.onResult(it.results, null, 2)
}
}
})
}
override fun loadAfter(params: LoadParams<Int>, callback: LoadCallback<Int, Discover>) {
Log.d(TAG, "loadAfter: "+params.key)
}
override fun loadBefore(params: LoadParams<Int>, callback: LoadCallback<Int, Discover>) {
Log.d(TAG, "loadBefore: "+params.key)
}
}
Run Code Online (Sandbox Code Playgroud)
loadInitial(), loadAfter(),loadBefore()已经是异步的。如果你尝试println(Thread.currentThread().name)你会得到arch_disk_io_0。要解决这个问题,您需要像同步一样执行代码,以免错过回调。如果您切换线程,您将错过回调,库已经在这样做了。
好吧,在进行了许多更改之后,我发现了可以解决该问题的东西,但这太奇怪了。如果我使用enqueueRetrofit 2.3,它将无法正常工作,但是如果我执行了.execute()LiveData,则会正确触发
如果有人对这个问题有更好的解释,欢迎您!
编辑:我刚刚阅读了Paging library overviewandroid网站上的页面,我发现了这一点:
要显示来自后端服务器的数据,请使用Retrofit API的同步版本将信息加载到您自己的自定义DataSource对象中。
| 归档时间: |
|
| 查看次数: |
1635 次 |
| 最近记录: |