自定义构造函数PageKeyedDataSource()使分页库的datasource.factory()中的应用程序崩溃

时间:2019-06-24 22:41:12

标签: android search kotlin backend paging

我正在尝试向分页库的数据源工厂中使用的自定义数据源发送搜索查询。当我的数据源类为空时,或者当我有一个空的构造函数以及一个执行不带参数的get请求的改造客户机时,那么就没有问题,并且它可以很好地加载数据。但是,当我修改类以包含针对改装客户端的搜索查询时,由于以下调用,当在AudiofileDataSourceFactory.create()中返回数据源时,我的应用程序崩溃了:

val audiofileList : LiveData<PagedList<Audiofile>> =
            dataSourceFactory.toLiveData(pageSize = 50)

在我的视图模型中

我的数据源工厂如下所示:

class AudiofileDataSourceFactory : DataSource.Factory<Int, Audiofile>(){
    private var searchQuery = ""
    var mutableLiveData = MutableLiveData<AudiofileDataSource>()

    override fun create(): DataSource<Int, Audiofile> {
        val audiofileDataSource = AudiofileDataSource(searchQuery)
        mutableLiveData.postValue(audiofileDataSource)
        return audiofileDataSource
    }

    fun setSearchQuery(query : String){
        searchQuery = query
    }

}

我的数据源如下所示。


class AudiofileDataSource(text : String) : PageKeyedDataSource<Int, Audiofile>() {
    var searchString = text

    override fun loadInitial(params: LoadInitialParams<Int>, callback: LoadInitialCallback<Int, Audiofile>) {

        retrofitProvider.instance.getAudiofiles(searchString).enqueue(object : Callback<List<Audiofile>> {
            override fun onFailure(call: Call<List<Audiofile>>, t: Throwable) {
                print(t.message)
            }
            override fun onResponse(call: Call<List<Audiofile>>, response: Response<List<Audiofile>>) {
                val audiofileList = response.body()!!
                callback.onResult(audiofileList, null, 2)
            }
        })
    }

    override fun loadAfter(params: LoadParams<Int>, callback: LoadCallback<Int, Audiofile>) {
        retrofitProvider.instance.getAudiofiles(searchString).enqueue(object : Callback<List<Audiofile>> {
            override fun onFailure(call: Call<List<Audiofile>>, t: Throwable) {
            }
            override fun onResponse(call: Call<List<Audiofile>>, response: Response<List<Audiofile>>) {
                val audiofileList = response.body()!!
                callback.onResult(audiofileList, params.key + 1)
            }
        })
    }

    override fun loadBefore(params: LoadParams<Int>, callback: LoadCallback<Int, Audiofile>) {

    }
}

如果在数据源中我删除了searchquery,并且未将任何参数传递给改造调用,那么它将正常工作。但就目前而言,它在AudiofileDataSourceFactory.create()方法中返回audiofileDataSource时崩溃。我在想也许返回类型不能转换为数据源,但我不确定为什么。

预先感谢您的帮助!

1 个答案:

答案 0 :(得分:0)

已解决:

上面的代码可以正常工作,但是改造引发了一个异常(由于格式错误的请求),我没有捕获到异常,因此程序崩溃了。