无法使用 RxJava Completable 在 Room 中添加数据

Dig*_*jay 1 android rx-java2

我正在使用 MVVM 架构模式制作一个应用程序,我正在尝试使用 RxJava 在房间数据库中添加数据,但它在 lambda 表达式下显示红线:

lambda 表达式中的返回类型错误:void 无法转换为 Object。

下面是我的代码:

UserDao.java

@Dao
public interface UserDao {

@Insert
void insert(User user);

@Query("SELECT * FROM Users ORDER BY id DESC")
Flowable<List<User>> getAllUsers();

} 
Run Code Online (Sandbox Code Playgroud)

用户存储库.java

public class UserRepository {

private UserDb userDb;
private UserDao userDao;
private Flowable<List<User>> allUsers;

public UserRepository(Application application) {

    userDb = UserDb.getInstance(application);
    userDao = userDb.userDao();
    allUsers = userDao.getAllUsers();
}

public void insert(final User user){

   Completable.fromCallable(() -> userDb.userDao().insert(user))
                            .subscribeOn(Schedulers.io())
                            .observeOn(AndroidSchedulers.mainThread())
                            .subscribe(new CompletableObserver() {
                                @Override
                                public void onSubscribe(Disposable d) {

                                }

                                @Override
                                public void onComplete() {

                                }

                                @Override
                                public void onError(Throwable e) {

                                }
                            });
    }
}
Run Code Online (Sandbox Code Playgroud)

有人请让我知道我做错了什么。任何帮助,将不胜感激。

谢谢

Zum*_*Kua 5

Completable.fromCallable您应该使用 ,而不是使用Completable.fromAction,它不需要 lambda 来返回某些内容。

要在插入完成或失败时显示 toast:

public class UserRepository {

private UserDb userDb;
private UserDao userDao;
private Flowable<List<User>> allUsers;

    public UserRepository(Application application) {

        userDb = UserDb.getInstance(application);
        userDao = userDb.userDao();
        allUsers = userDao.getAllUsers();
    }

    public Completable insert(final User user){

       return Completable.fromAction(() -> userDb.userDao().insert(user))
                                .subscribeOn(Schedulers.io())
                                .observeOn(AndroidSchedulers.mainThread());
    }
}

Run Code Online (Sandbox Code Playgroud)

在你的活动中:

    public void onInsertClicked(){
        userRepository = //get your repository instance.
        //remember to dispose this disposable when activity destroyed, otherwise the onComplete callback will leak reference to our activity.
        Disposable disposable = userRepository.subscribe(() -> Toast.makeText(this, "Completed!", Toast.LENGTH_SHORT).show(), 
                throwable -> Toast.makeText(this, "Error!", Toast.LENGTH_SHORT).show());
    }

Run Code Online (Sandbox Code Playgroud)

如果您不想在活动中调用 insert:

您还可以将应用程序的引用保存在存储库中

public class UserRepository {

    private UserDb userDb;
    private UserDao userDao;
    private Flowable<List<User>> allUsers;
    private final Context context;

    public UserRepository(Application application) {

        userDb = UserDb.getInstance(application);
        userDao = userDb.userDao();
        allUsers = userDao.getAllUsers();
        context = application.getApplicationContext();
    }

    public void insert(final User user){

       Completable.fromAction(() -> userDb.userDao().insert(user))
                                .subscribeOn(Schedulers.io())
                                .observeOn(AndroidSchedulers.mainThread())
                                .subscribe(() -> Toast.makeText(context, "Completed!", Toast.LENGTH_SHORT).show(), 
                                                throwable -> Toast.makeText(context, "Error!", Toast.LENGTH_SHORT).show());
    }
}
Run Code Online (Sandbox Code Playgroud)