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

问题描述 投票:0回答:1

我正在尝试将搜索查询发送到分页库的数据源工厂中使用的自定义数据源。当我的数据源类为空时,或者当我有一个空的构造函数以及一个执行不带参数的 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>) {

    }
}

如果在数据源中我删除了搜索查询并且不向改造调用传递任何参数,那么它可以正常工作。但现在它在 AudiofileDataSourceFactory.create() 方法中返回 audiofileDataSource 时崩溃。我在想也许返回类型无法转换为 DataSource 但我不确定为什么。

android kotlin search android-paging-library
1个回答
0
投票

已解决:

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

© www.soinside.com 2019 - 2024. All rights reserved.