Android 在可观察结果RxJava之后运行DB Update方法 你好
应用程序:我有一个非常基本的应用程序,它有一些机器名称、id、总收入和一些收入id、货币、票据、机器id。在第一个屏幕上,我允许用户从一个工厂添加一台机器,然后我将其显示在回收视图中。当用户单击任何一台机器时,我会将它们导航到第二个屏幕,在那里用户可以看到机器的名称、总收入和一个RecyclerView及其相应的收入;有一个晶圆厂,使他们能够增加该机器的收入,并刷新RecyclerView 问题是:我一直未能将传统世界转换为RxJava 我使用Room.allowmainthread查询和常规方法成功地实现了它 机械设备模型 机械人 机器信息活动 我知道Room需要在后台线程中实例化,这就是我使用RxJava的原因。但是,当我尝试将上述方法转换为RxJava世界时,就像下面的方法一样,我没有更新,但没有崩溃,方法的返回值从未使用过 机械设备模型 机械人 尝试1:失败 机械人 机器信息活动Android 在可观察结果RxJava之后运行DB Update方法 你好,android,rx-java,rx-java2,android-room,Android,Rx Java,Rx Java2,Android Room,应用程序:我有一个非常基本的应用程序,它有一些机器名称、id、总收入和一些收入id、货币、票据、机器id。在第一个屏幕上,我允许用户从一个工厂添加一台机器,然后我将其显示在回收视图中。当用户单击任何一台机器时,我会将它们导航到第二个屏幕,在那里用户可以看到机器的名称、总收入和一个RecyclerView及其相应的收入;有一个晶圆厂,使他们能够增加该机器的收入,并刷新RecyclerView 问题是:我一直未能将传统世界转换为RxJava 我使用Room.allowmainthread查询和常规方
你说失败是什么意思?数据库是否没有更新,或者您是否遇到了一些异常 无论如何,我看到的主要问题是,您没有订阅您的可完成对象-没有这一点,它们将不会被执行 因此,改变:
machineViewModel.updateByID(id, total_amount);
例如:
machineViewModel.updateByID(id, total_amount).subscribeOn(Schedulers.io()).observeOn(Schedulers.io()).subscribe();
当然,它会起作用,你可能需要添加特定的订阅方订阅方法。好的,多亏了Michael,我找到了问题的症结所在
显然,你可以在一次性用品中添加一次性用品
您需要初始化可观察对象并添加其.observeOnetc.subscribeOnetc.subscribeetc
将一次性塑料袋放入一次性塑料袋中,如下所示:
disposable.add(incomeViewModel.getIncomeOfMachine(id)
.defaultIfEmpty(0.0)
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(total_amount -> {
if (total_amount != null) {
disposable.add(machineViewModel.updateByID(id, total_amount)
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(
() -> Log.d(TAG, "MachineInfo: COMPLETED"),
throwable -> Log.e(TAG, "MachineInfo: ERROR", throwable )));
DecimalFormat formatter = new DecimalFormat("$#,##0.000");
String formatted = formatter.format(total_amount);
mMoney.setText(formatted);
showMenu = true;
} else {
mMoney.setText("$0.0");
}
}, throwable -> Log.d(TAG, "MachineInfo 2: ERROR")));
我注意到“如果”是一个干净的答案,但它是有效的。添加了关于我失败的地方的解释。我无法更新,但没有崩溃,方法的返回值从未使用过。根据您的回答:我在第一个Observable中添加了您的示例,得到了一条奇怪的消息=无法访问主线程上的数据库,因为它可能会在很长一段时间内锁定UI。抱歉,已经很晚了:D它当然应该是subscribeOnSchedulers.io.observeOnSchedulers.io,不是observeOnSchedulers.io.observeOnSchedulers.io。我更新了我的答案:顺便说一句,这条消息并不奇怪。如果我们不描述它应该订阅的线程,默认情况下,它将在Android的UI线程上执行,因此访问数据库确实是在UI线程上完成的,这是一种糟糕的做法。
public Completable updateByID(long id, double total_income){
return Completable.fromAction(() -> machinesDB.getMachineDAO().updateMachineByID(id, total_income));
}
@Query("update machines set total_income = :total_income where id = :id")
int updateMachineByID(long id, double total_income);
private PublishSubject<Double> publishSubject = PublishSubject.create();
private Observable<Double> clickEvent = publishSubject;
/*
/ other stuff in here
*/
disposable.add(incomeViewModel.getIncomeOfMachine(id)
.defaultIfEmpty(0.0)
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(total_amount -> {
if (total_amount != null) {
publishSubject.onNext(total_amount);
DecimalFormat formatter = new DecimalFormat("$#,##0.000");
String formatted = formatter.format(total_amount);
mMoney.setText(formatted);
showMenu = true;
} else {
mMoney.setText("$0.0");
}
}, throwable -> Log.d(TAG, "MachineInfo: ERROR")));
disposable.add(clickEvent.subscribe(
total_amount -> machineViewModel.updateByID(id, total_amount)));
public Completable updateByID(long id, double total_income){
return Completable.fromCallable(() -> machinesDB.getMachineDAO().updateMachineByID(id, total_income));
}
@Query("update machines set total_income = :total_income where id = :id")
int updateMachineByID(long id, double total_income);
disposable.add(incomeViewModel.getIncomeOfMachine(id)
.defaultIfEmpty(0.0)
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(total_amount -> {
if (total_amount != null) {
// Completable.fromCallable()
machineViewModel.updateByID(id, total_amount);
DecimalFormat formatter = new DecimalFormat("$#,##0.000");
String formatted = formatter.format(total_amount);
mMoney.setText(formatted);
Toast.makeText(this, "MachineInfo: " + String.valueOf(machineViewModel.updateByID(id, total_amount)), Toast.LENGTH_SHORT).show();
showMenu = true;
} else {
mMoney.setText("$0.0");
}
}, throwable -> Log.e(TAG, "MachineInfo: ERROR", throwable )));
machineViewModel.updateByID(id, total_amount);
machineViewModel.updateByID(id, total_amount).subscribeOn(Schedulers.io()).observeOn(Schedulers.io()).subscribe();
disposable.add(incomeViewModel.getIncomeOfMachine(id)
.defaultIfEmpty(0.0)
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(total_amount -> {
if (total_amount != null) {
disposable.add(machineViewModel.updateByID(id, total_amount)
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(
() -> Log.d(TAG, "MachineInfo: COMPLETED"),
throwable -> Log.e(TAG, "MachineInfo: ERROR", throwable )));
DecimalFormat formatter = new DecimalFormat("$#,##0.000");
String formatted = formatter.format(total_amount);
mMoney.setText(formatted);
showMenu = true;
} else {
mMoney.setText("$0.0");
}
}, throwable -> Log.d(TAG, "MachineInfo 2: ERROR")));