Комната с Rx Java не срабатывает в следующий раз в автономном режиме - PullRequest
0 голосов
/ 09 апреля 2020

В моем приложении я извлекаю некоторые данные из inte rnet и сохраняю их, используя комнату, чтобы потом их можно было отобразить, когда устройство не в сети. В моем поставщике данных я использую Observable.concat, чтобы присоединить запрос к моей локальной базе данных и вызвать остальные API. Вот мой код:

class DataProvider(private val apiInterface: Api, private val database: Database) {

private val DATE_FORMAT = "yyyy-MM-dd'T'HH:mm:ss.SSS'Z'"

fun getData(): Observable<List<Data>> {
    return Observable.concat(database.dataDao().queryData().toObservable().doOnNext{ println("TEST SIZE ${it.size}") }, 
        apiInterface.getData().doOnNext{
            database.dataDao().deleteAllData()
            database.dataDao().insertData(it) }
        ).map { it.map { data->
        Event(
            id = data.id,
            title = data.title,
            date = LocalDateTime.parse(
                edata.date,
                DateTimeFormatter.ofPattern(DATE_FORMAT)
            )
        )
    }.sortedBy { it.date } }
}
}

@Database(entities = [DataResponse::class], version = 1)
abstract class Database  : RoomDatabase() {
abstract fun dataDao(): DataDao
}

@Dao
interface DataDao {
@Query("SELECT * FROM dataresponse")
fun queryData(): Single<List<DataResponse>>

@Insert
fun insertData(data: List<DataResponse>)

@Query("DELETE FROM dataresponse")
fun deleteAllData()

}

interface Api {
@GET("getData")
fun getData(): Observable<List<DataResponse>>
}

@Entity
data class DataResponse(
@PrimaryKey val id: String,
@ColumnInfo(name = "title") val title: String,
@ColumnInfo(name = "date") val date: String

Здесь я сначала выбираю данные из базы данных, а затем из API. Если вызов API успешен, я сохраняю ответ в базе данных, но сначала очищаю таблицу. Когда устройство подключено к сети, все в порядке. Во время отладки я вижу, что onNext в моем докладчике вызывается дважды, один раз из базы данных и один раз из вызова API. Но когда я выключаю inte rnet onNext не называется cat all. Как вы можете видеть в моем поставщике данных при извлечении данных из базы данных, я добавил код .doOnNext{ println("TEST SIZE ${it.size}") } для целей тестирования, и текст печатается в режиме онлайн, но докладчик по-прежнему не получает никаких данных. Это почему? Основная идея этого кода заключается в том, что, когда пользователь имеет доступ к приложению inte rnet, он будет отображать данные, полученные в произвольном порядке sh, но когда он не в сети, тогда должны отображаться данные, хранящиеся в базе данных. Что я здесь не так делаю?

Также я заметил, что это работает так, как задумано, пока я отлаживаю, но никогда, когда я запускаю приложение обычным способом

...