首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >安卓寻呼库LiveData<PagedList<T>>是在api调用结束之前触发的

安卓寻呼库LiveData<PagedList<T>>是在api调用结束之前触发的
EN

Stack Overflow用户
提问于 2018-10-26 21:58:43
回答 2查看 3.7K关注 0票数 4

已经过了两天了,我正在努力学习如何用Kotlin语言使用新的寻呼库(也是第一次)。

因此,我已经阅读了许多指南/教程和guide (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 :

代码语言:javascript
复制
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

这是我的代码:

Fragment.kt

代码语言:javascript
复制
    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)
    })

MainViewModel.kt

代码语言:javascript
复制
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()
    }
}

DataSourceFactory.kt

代码语言:javascript
复制
class DataSourceFactory(api: DiscoverService) : DataSource.Factory<Int, Discover>() {
    val source = SequentialDataSource(api)

    override fun create(): DataSource<Int, Discover> {
        return source
    }
}

SequentialDataSource.kt

代码语言:javascript
复制
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)
    }
}
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2018-10-27 00:08:50

嗯,经过很多次改变后,我找到了一些解决问题的方法,但这太奇怪了。如果我在Retroeft2.3中使用enqueue,它将不能工作,但如果我使用.execute(),则LiveData将被正确触发

如果有人对这个问题有一个更好的解释,你非常欢迎!

编辑:我刚刚在安卓网站上看到了Paging library overview页面,我发现:

若要显示来自后端服务器的数据,请使用Retrofit的同步版本将信息加载到您自己的自定义DataSource对象中。

票数 9
EN

Stack Overflow用户

发布于 2019-02-28 15:39:59

loadInitial()loadAfter()loadBefore()已经是异步的了。如果您尝试println(Thread.currentThread().name),您将得到arch_disk_io_0。要解决这个问题,您需要执行类似于同步的代码,这样才不会错过回调。如果您切换线程,库已经在这样做了,您将错过回调。

票数 6
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/53016777

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档