Room和RxJava提供不一致的结果

时间:2018-10-03 20:21:44

标签: rx-java2 android-room

这是我第一次使用Room和RxJava。当我从数据库中读取数据时,得到的结果非常不一致。我有一个嵌套的RecyclerView,其中第一个只显示星期几,第二个显示每天的预报。

有时,当我启动该应用程序时,所有内容都会立即显示出来。在其他时间,仅显示日期,而不显示每天的预测。其他时间,没有显示RecyclerViews。但是,如果我使用Stetho查看数据库,则数据位于设备内。

这是我设置Dao的方式:

@Dao
public interface MyDao {

    // Other CRUD methods

    @Query("SELECT DISTINCT date FROM my_table")
    Single<List<LocalDate>> getUniqueDays();

    @Query("SELECT * FROM my_table WHERE date == :localDate")
    Single<List<Forecasts>> getForecastForDay(LocalDate localDate);

}

我使用以下命令填充第一个RecyclerView:

Single<List<LocalDate>> source = MyApp.getDatabase().getDao().getUniqueDays();
source.subscribeOn(Schedulers.io())
        .observeOn(AndroidSchedulers.mainThread())
        .subscribe(new SingleObserver<List<LocalDate>>() {
            @Override
            public void onSubscribe(Disposable d) {

            }

            @Override
            public void onSuccess(List<LocalDate> localDates) {
                mAdapter.refreshData(localDates);
            }

            @Override
            public void onError(Throwable e) {

            }
        });

这在显示星期几的片段中被调用。

然后,在一周中的几天之内,我还需要在适配器中填充内部RecyclerView,该操作是在ViewHolder的bind()中完成的:

public void bind(LocalDate date, int position){

   // A bunch of other views being set


    mHourlyForecasts.setHasFixedSize(true);
    LinearLayoutManager layoutManager = new LinearLayoutManager(mContext, LinearLayoutManager.HORIZONTAL, false);
    mHourlyForecasts.setLayoutManager(layoutManager);

    mAdapter = new HourlyForecastAdapter(mContext);
    mHourlyForecasts.setAdapter(mAdapter);

    Single<List<Forecasts>> source = MyApp.getDatabase().getDao().getForecastForDay(date);
    source.subscribeOn(Schedulers.io())
            .observeOn(AndroidSchedulers.mainThread())
            .subscribe(new SingleObserver<List<Forecasts>>() {
                @Override
                public void onSubscribe(Disposable d) {

                }

                @Override
                public void onSuccess(List<Forecasts> conditions) {
                    Timber.i("Size of conditions in onSuccess(): %d", conditions.size());
                    mAdapter.refreshData(conditions);
                }

                @Override
                public void onError(Throwable e) {

                }
            });
}

但是,我不知道为什么数据不能一直显示。有时在启动时不显示数据,有时却不显示。有时,我会关闭应用程序并重新打开它,但缺少一些数据。或全部都在那里。再说一次,当我在Stetho中检查设备时,数据就存在于数据库中,只是没有在RecyclerView中显示。

如果有人可以提供一些指导,将不胜感激...

0 个答案:

没有答案