Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/201.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 在可观察结果RxJava之后运行DB Update方法 你好_Android_Rx Java_Rx Java2_Android Room - Fatal编程技术网

Android 在可观察结果RxJava之后运行DB Update方法 你好

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查询和常规方

应用程序:我有一个非常基本的应用程序,它有一些机器名称、id、总收入和一些收入id、货币、票据、机器id。在第一个屏幕上,我允许用户从一个工厂添加一台机器,然后我将其显示在回收视图中。当用户单击任何一台机器时,我会将它们导航到第二个屏幕,在那里用户可以看到机器的名称、总收入和一个RecyclerView及其相应的收入;有一个晶圆厂,使他们能够增加该机器的收入,并刷新RecyclerView

问题是:我一直未能将传统世界转换为RxJava

我使用Room.allowmainthread查询和常规方法成功地实现了它

机械设备模型

机械人

机器信息活动

我知道Room需要在后台线程中实例化,这就是我使用RxJava的原因。但是,当我尝试将上述方法转换为RxJava世界时,就像下面的方法一样,我没有更新,但没有崩溃,方法的返回值从未使用过

机械设备模型

机械人

尝试1:失败

机械人

机器信息活动


你说失败是什么意思?数据库是否没有更新,或者您是否遇到了一些异常

无论如何,我看到的主要问题是,您没有订阅您的可完成对象-没有这一点,它们将不会被执行

因此,改变:

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")));