Проблема с liveData. Android

Проблема: Данный код отрабатывает только тогда, когда я только запустил приложение или когда я повернул экран (как я понимаю при смене конфигурации Activity занова привязывается).

Затем я пытаюсь сделать запрос, и он у меня не отрабатывает. Повесив где только возможно Log, я понял что при этом код не выполняется внутри liveData() в resultLiveData. Почему так происходит? и как исправить?

Имеется BaseRemoteSource, который отвечает за получение данных с удаленного сервиса

abstract class BaseDataSource{

        public suspend fun <T> getResult(call : suspend () -> Response<T>) : Result<T>{
            try {
                //Получаем ответ от вызова
                val response = call()
                if(response.isSuccessful) {
                    //тело
                    val body = response.body()
                    if (body != null) return Result.success(body)
                }
                return error("${response.code()} ${response.message()} ${response.errorBody()}")
            }
            catch (e: Exception){
                Log.d("BaseDataSource", e.toString())
                return Result.error(e.message ?: e.toString())
            }
        }
    }

Имеется его наследник

class AlbumRemoteDataSource @Inject constructor(
    private val apiService: APIService
): BaseDataSource(){
    suspend fun getAlbumsBySearch(searchQuery: String): Result<AlbumsResponse>{
        val result = getResult{apiService.getAlbumsBySearch(searchQuery)}
        Log.d("AlbumRemoteDataSource", result.toString())
        return result
    }
}

В repository я получаю данные с удаленного сервиса, добавляю в базу данных, а потом получаю из нее готовый набор.

class AlbumRepository @Inject constructor(private val remoteSource: AlbumRemoteDataSource, private val database: AppDatabase){

    fun getAlbumsBySearch(searchQuery: String): LiveData<Result<List<Album>>>{

        Log.d("RepositoryNew", searchQuery)
        val resultLiveData = resultLiveData(
            databaseQuery = {database.getAlbumDao().getAlbumsBySearch("%${searchQuery}%")},
            networkCall = {remoteSource.getAlbumsBySearch(searchQuery)},
            saveCallResult = {database.getAlbumDao().insertAll(it.results)}
        )
        Log.d("AlbumRepository", resultLiveData.value.toString())
        return resultLiveData
    }
}

Как раз за это отвечает resultLiveData

fun <T, A> resultLiveData(
    databaseQuery: () -> LiveData<T>,
    networkCall: suspend () -> Result<A>,
    saveCallResult: suspend (A) -> Unit): LiveData<Result<T>> =
    liveData(Dispatchers.IO){
        emit(Result.loading<T>())
        val responseSource = networkCall.invoke()
        Log.d("ResultLiveData Network", responseSource.toString())
        if(responseSource.status == Result.Status.SUCCESS) {
            saveCallResult(responseSource.data!!)
            Log.d("resultLiveData", "save database")
        }
        else if(responseSource.status == Result.Status.ERROR){
            emit(Result.error(responseSource.error))
            Log.d("resultLiveData", "error ${responseSource.error}")
        }
        val databaseSource = databaseQuery.invoke()
        Log.d("ResultLiveData Database", databaseSource.value.toString())
        emitSource(databaseSource.map { Result.success(it) })
    }

Я хочу, чтобы через SearchView получались новые данные. Для этого я в ViewModel вызываю метод hangleSearchQuery

private fun getAlbumsBySearch(searchQuery: String) = repository.getAlbumsBySearch(searchQuery)
    fun handleSearchQuery(text: String?) {
        albums = getAlbumsBySearch(text.toString())
    }

Если смотреть на логи, то почему то не заходит в liveData() в resultLiveData при повторных запросах

Log

    2020-02-04 19:18:06.522 5326-5326/ru.ddstudio.simpleitunesapp D/AlbumListViewModel SV: ryf
2020-02-04 19:18:06.964 5326-5326/ru.ddstudio.simpleitunesapp D/RepositoryNew: ryfh
2020-02-04 19:18:06.964 5326-5326/ru.ddstudio.simpleitunesapp D/resultLiveData: input
2020-02-04 19:18:06.965 5326-5326/ru.ddstudio.simpleitunesapp D/resultLiveDataAll: androidx.lifecycle.CoroutineLiveData@f0a4b27
2020-02-04 19:18:06.965 5326-5326/ru.ddstudio.simpleitunesapp D/AlbumRepository: null
2020-02-04 19:18:06.965 5326-5326/ru.ddstudio.simpleitunesapp D/AlbumListViewModel SV: ryfh
2020-02-04 19:18:07.174 5326-5326/ru.ddstudio.simpleitunesapp D/RepositoryNew: ryfhh
2020-02-04 19:18:07.175 5326-5326/ru.ddstudio.simpleitunesapp D/resultLiveData: input
2020-02-04 19:18:07.175 5326-5326/ru.ddstudio.simpleitunesapp D/resultLiveDataAll: androidx.lifecycle.CoroutineLiveData@17211d4
2020-02-04 19:18:07.175 5326-5326/ru.ddstudio.simpleitunesapp D/AlbumRepository: null

ViewModel

class AlbumListViewModel @Inject constructor(private val repository: AlbumRepository): ViewModel(){
private var albums : LiveData<Result<List<Album>>> = getAlbumsBySearch("")

private fun getAlbumsBySearch(searchQuery: String): LiveData<Result<List<Album>>>{
    return repository.getAlbumsBySearch(searchQuery)}

fun getAlbums(): LiveData<Result<List<Album>>>{
    Log.d("AlbumListViewModel", albums.value.toString())
    return albums
}
fun handleSearchQuery(text: String?) {
    albums = if (text != null){
        getAlbumsBySearch(text)
    } else{
        getAlbumsBySearch("")
    }
    Log.d("AlbumListViewModel SV", text.toString())
}

}


Ответы (0 шт):