Пользовательский конструктор PageKeyedDataSource () завершает работу приложения в datasource.factory () библиотеки подкачки - PullRequest
0 голосов
/ 25 июня 2019

Я пытаюсь отправить поисковый запрос на мой пользовательский источник данных, используемый в фабрике источников данных библиотеки подкачки. Когда мой класс источника данных пуст или когда у меня есть пустой конструктор вместе с модифицированным клиентом, который выполняет запрос 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>) {

    }
}

Если в источнике данных я удаляю поисковый запрос и не передаю никакие параметры вызову дооснащения, он работает нормально. Но в настоящее время происходит сбой при возврате audiofileDataSource в методе AudiofileDataSourceFactory.create (). Я думал, что, возможно, возвращаемый тип не может быть преобразован в источник данных, но я не уверен, почему.

Заранее спасибо за помощь!

1 Ответ

0 голосов
/ 25 июня 2019

Решено:

Приведенный выше код работает нормально, но при модификации возникло исключение (из-за некорректного запроса), которое я не уловил, и, таким образом, моя программа потерпела крах.

...