【发布时间】:2019-07-29 23:59:24
【问题描述】:
我正在尝试使用 RxJava 在后台线程上使用我的 RoomDatabase。
我的 DAO 类:
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 方法):
import android.arch.persistence.room.Entity;
import android.arch.persistence.room.PrimaryKey;
import android.support.annotation.NonNull;
@Entity
public class Measurements
{
@NonNull
@PrimaryKey
public String mId;
public String finalResultIn;
public String finalResultFt;
public String lengthFt;
public String widthFt;
public String heightFt;
public String lengthIn;
public String widthIn;
public String heightIn;
public Measurements(String finalResultFt, String finalResultIn, String lengthFt, String widthFt, String heightFt,
String lengthIn, String widthIn, String heightIn)
{
this.finalResultFt = finalResultFt;
this.finalResultIn = finalResultIn;
this.lengthFt = lengthFt;
this.widthFt = widthFt;
this.heightFt = heightFt;
this.lengthIn = lengthIn;
this.widthIn = widthIn;
this.heightIn = heightIn;
}
}
最后,这是我的 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() {
}
});
我收到一条错误消息:
java.lang.IllegalStateException: Cannot access database on the main thread since it may potentially lock the UI for a long period of time.
我的 RxJava 代码中缺少哪些未将进程置于后台线程的内容?
【问题讨论】:
-
onSubscribe()正在主应用程序线程上被调用,由observeOn(AndroidSchedulers.mainThread())提供。您可能希望insertMeasurements()返回Completable,然后订阅它,并摆脱Observable.just()的东西。 -
好的,我试试,谢谢!
标签: java android rx-java android-room