Room数据库RxJava后台线程

Room数据库RxJava后台线程,java,android,rx-java,android-room,Java,Android,Rx Java,Android Room,我正在尝试使用RxJava在后台线程上使用RoomDatabase 我的刀类: import android.arch.persistence.room.Dao; import android.arch.persistence.room.Insert; import java.util.List; @Dao public interface MeasurementDAO { @Insert public void insertMeasurements(Measurements

我正在尝试使用RxJava在后台线程上使用RoomDatabase

我的刀类:

import android.arch.persistence.room.Dao;
import android.arch.persistence.room.Insert;
import java.util.List;

@Dao
public interface MeasurementDAO
{
    @Insert
    public void insertMeasurements(Measurements m);
}
我的实体类(为简洁起见省略了getter和setter方法):

最后,这里是我的MeasurementDatabase类:

@Database(entities = {Measurements.class}, version = 1)
public abstract class MeasurementDatabase extends RoomDatabase
{
    private static final String DB_NAME = "measurement_db";
    private static MeasurementDatabase instance;

    public static synchronized  MeasurementDatabase getInstance(Context context)
    {
        if(instance == null)
        {
            instance = Room.databaseBuilder(context.getApplicationContext(), MeasurementDatabase.class,
                    DB_NAME)
                    .fallbackToDestructiveMigration()
                    .build();
        }
        return instance;
    }

    public abstract MeasurementDAO measurementDAO();
}
在我的片段中,我试图在单击菜单项后插入背景线程:

最终测量数据库appDb=

MeasurementDatabase.getInstance(getActivity());


                //fill the values with the appropriate;
                final Measurements m = new Measurements(
                        cubicInches.getText().toString(),
                        cubicFeet.getText().toString(),
                        len_ft.getText().toString(),
                        width_ft.getText().toString(),
                        height_ft.getText().toString(),
                        len_in.getText().toString(),
                        width_in.getText().toString(),
                        height_in.getText().toString());

                Observable.just(appDb)
                        .subscribeOn(Schedulers.io())
                        .observeOn(AndroidSchedulers.mainThread())
                        .subscribe(new Observer<MeasurementDatabase>(){

                            @Override
                            public void onSubscribe(Disposable d) {
                                appDb.measurementDAO().insertMeasurements(m);

                            }

                            @Override
                            public void onNext(MeasurementDatabase measurementDatabase)
                            {
                            }

                            @Override
                            public void onError(Throwable e) {

                            }

                            @Override
                            public void onComplete() {

                            }
                        });

我的RxJava代码中缺少了什么,没有将进程放在后台线程上?

多亏@commonware提供了一些线索,我才能够找到我缺少的部分:

Completable.fromAction(() -> appDb.measurementDAO().insertMeasurements(m))
                        .subscribeOn(Schedulers.io())
                        .subscribe();

创建一个可观察对象,并在其中写入您的逻辑。您可以订阅可观察对象并获取布尔值

 public Observable<Boolean> insertObject(Measurements m) {
    return Observable.create(new ObservableOnSubscribe<Boolean>() {
        @Override
        public void subscribe(ObservableEmitter<Boolean> e) {
            appDb.measurementDAO().insertMeasurements(m);
            e.onNext(true);
            e.onComplete();
        }
    }).subscribeOn(Schedulers.io());            

}
公共可观测插入对象(m){
返回Observable.create(newobservableOnSubscribe(){
@凌驾
公开无效认购(可观测提交人e){
appDb.measurementDAO().insertmeasures(m);
e、 onNext(真);
e、 onComplete();
}
}).subscribeOn(Schedulers.io());
}

我知道你有答案,但你永远不知道这是否失败。我确信您的dao insert方法可以返回
long[]
(插入行的id)

你可以很容易地做到:

Completable.fromCallable(() ->
            appDb.measurementDAO().insertMeasurements(m).length != 0 ?
                    Completable.complete() :
                    Completable.error(new IllegalStateException("Error inserting " + m.toString())))
            .subscribeOn(Schedulers.io())
            .subscribe(() -> { }, Throwable::printStackTrace);

onSubscribe()
正在主应用程序线程上调用,这是由observeOn(AndroidSchedulers.mainThread())提供的。你可能想要
insertMeasurements()
return
Completable
,然后订阅它,并去掉
可观察的。just()
东西。好的,我会试试的,谢谢!因此,无论
appDb.measurementDAO().insertMeasurements(m)
的结果是否成功,这将发出
true
?这不是一个好的解决方案。Insert应该返回一个
long[]
和测试的结果,可以使用
Completable
@MarkKeen进行测试。您还可以根据您的逻辑添加e.onError(),并且Observable emits false!别担心!一切都好!这不是基于我的逻辑,这是你的答案?我也不担心我写的代码。
 public Observable<Boolean> insertObject(Measurements m) {
    return Observable.create(new ObservableOnSubscribe<Boolean>() {
        @Override
        public void subscribe(ObservableEmitter<Boolean> e) {
            appDb.measurementDAO().insertMeasurements(m);
            e.onNext(true);
            e.onComplete();
        }
    }).subscribeOn(Schedulers.io());            

}
Completable.fromCallable(() ->
            appDb.measurementDAO().insertMeasurements(m).length != 0 ?
                    Completable.complete() :
                    Completable.error(new IllegalStateException("Error inserting " + m.toString())))
            .subscribeOn(Schedulers.io())
            .subscribe(() -> { }, Throwable::printStackTrace);