RXJava "Single<Long> insert" 仅在 activity 完成之前正确插入( finish() )
RXJava "Single<Long> insert" only insert correctly before the activity is finished ( finish() )
我在 Room 中使用 RXJava 时遇到了一些问题。我尝试插入一些数据并在插入 (onSucess) 调用 finish()
后关闭 activity.
如果我不在 activity 上调用 finish()
,一切都很好,我插入了我想要的数据,返回的 ID 是正确的(1、2、3、4.. .) 和数据显示在 table 上。如果调用 finish()
并再次打开 activity,onSucess(Long aLong)
只有 returns id 1 而 table 不再更新。
有代码:
Client client = new Client();
client.birth_date = birthDate.toString();
client.health_status = healthStatus;
client.lives_with = livesWith;
client.name = name;
client.school_time = schoolTime;
singleObserver = database().clientDAO().insert(client);
singleObserver.subscribeOn(Schedulers.computation())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(new DisposableSingleObserver<Long>() {
@Override
public void onSuccess(Long aLong) {
String formated = String.format(getApplication().getString(R.string.new_client_register), client.name);
Toast toast = Toast.makeText(getApplication(), formated, Toast.LENGTH_SHORT);
toast.show();
finish();
}
@Override
public void onError(Throwable e) {
}
});
在 DAO 中我只是声明:
@Insert
Single<Long> insert(Client client);
我被困了 2 天,但我没有发现我做错了什么。问题是,为什么 Single
在我完成 activity 后行为会有所不同。我试图取消订阅并以某种方式搜索以销毁附加到它的变量,但行为仍然相同。
有人可以帮助我吗?
我的 RXJava 代码没有问题。
我想通了打开数据库检查器时发生了什么。创建了两个数据库实例,因为我每次打开 activity.
都会调用 Room.inMemoryDatabaseBuilder
我只是忘了调用单例来保持一个唯一的实例(仅在开发应用程序时)
如果有人需要,这就是我用来保持最终数据库清洁的方式:
public static synchronized Database getInstance(Context context) {
if (instance == null && !BuildConfig.DEBUG) {
instance = Room.databaseBuilder(context.getApplicationContext(),
Database.class,
DBNAME)
.allowMainThreadQueries()
// TODO: MIGRATE METHOD
// TODO: REMOVE BEFORE LAUNCH FOR FINAL USER, DATA LOSS DANGER!
.fallbackToDestructiveMigration()
.build();
}
// TODO: change build to release when launch
if (instance == null && BuildConfig.DEBUG) {
instance =Room.inMemoryDatabaseBuilder(context.getApplicationContext(),
Database.class)
.allowMainThreadQueries()
.build();
}
return instance;
}
注意:我的情况allowMainThreadQueries()
不危险,不管我不推荐哈哈。
我在 Room 中使用 RXJava 时遇到了一些问题。我尝试插入一些数据并在插入 (onSucess) 调用 finish()
后关闭 activity.
如果我不在 activity 上调用 finish()
,一切都很好,我插入了我想要的数据,返回的 ID 是正确的(1、2、3、4.. .) 和数据显示在 table 上。如果调用 finish()
并再次打开 activity,onSucess(Long aLong)
只有 returns id 1 而 table 不再更新。
有代码:
Client client = new Client();
client.birth_date = birthDate.toString();
client.health_status = healthStatus;
client.lives_with = livesWith;
client.name = name;
client.school_time = schoolTime;
singleObserver = database().clientDAO().insert(client);
singleObserver.subscribeOn(Schedulers.computation())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(new DisposableSingleObserver<Long>() {
@Override
public void onSuccess(Long aLong) {
String formated = String.format(getApplication().getString(R.string.new_client_register), client.name);
Toast toast = Toast.makeText(getApplication(), formated, Toast.LENGTH_SHORT);
toast.show();
finish();
}
@Override
public void onError(Throwable e) {
}
});
在 DAO 中我只是声明:
@Insert
Single<Long> insert(Client client);
我被困了 2 天,但我没有发现我做错了什么。问题是,为什么 Single
在我完成 activity 后行为会有所不同。我试图取消订阅并以某种方式搜索以销毁附加到它的变量,但行为仍然相同。
有人可以帮助我吗?
我的 RXJava 代码没有问题。
我想通了打开数据库检查器时发生了什么。创建了两个数据库实例,因为我每次打开 activity.
都会调用Room.inMemoryDatabaseBuilder
我只是忘了调用单例来保持一个唯一的实例(仅在开发应用程序时)
如果有人需要,这就是我用来保持最终数据库清洁的方式:
public static synchronized Database getInstance(Context context) {
if (instance == null && !BuildConfig.DEBUG) {
instance = Room.databaseBuilder(context.getApplicationContext(),
Database.class,
DBNAME)
.allowMainThreadQueries()
// TODO: MIGRATE METHOD
// TODO: REMOVE BEFORE LAUNCH FOR FINAL USER, DATA LOSS DANGER!
.fallbackToDestructiveMigration()
.build();
}
// TODO: change build to release when launch
if (instance == null && BuildConfig.DEBUG) {
instance =Room.inMemoryDatabaseBuilder(context.getApplicationContext(),
Database.class)
.allowMainThreadQueries()
.build();
}
return instance;
}
注意:我的情况allowMainThreadQueries()
不危险,不管我不推荐哈哈。