Room数据库RxJava后台线程
我正在尝试使用RxJava在后台线程上使用RoomDatabase 我的刀类: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
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()
returnCompletable
,然后订阅它,并去掉可观察的。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);