将 AsyncTask 替换为 Rxjava 用于 Room 数据库

Replace AsyncTask with Rxjava for Room Database

我正在尝试用 RxJava 替换 AsyncTask,因为 Async 在 Android11 中被弃用了。但是我无法让 RxJava 与 Room 一起工作,

这是当前使用 Asynctask 的工作代码:

在存储库中:

public void insertItems(List<Items> items){
    new insertItemsAsyncTask(PrjDao).execute(items);
}

private static class insertItemAsyncTask extends AsyncTask<List<Items>, Void, Void>{
    private PrjDao prjDao;

    private insertItemAsyncTask(PrjDao prjDao){
        this.prjDao = prjDao;
    }

    @Override
    protected Void doInBackground(List<Items>... lists) {
        prjDao.insertItems(lists[0]);
        return null;
    }
}

在 DAO 中

@Insert
void insertItems(List<Items> items);

我将存储库代码替换为:

public void insertItems(List<Items> items){
    Completable.fromAction(() -> prjDao.insertItems(items)).subscribeOn(Schedulers.io()).observeOn(AndroidSchedulers.mainThread())
            .subscribe(new CompletableObserver() {
                @Override
                public void onSubscribe(@NonNull Disposable d) {

                }

                @Override
                public void onComplete() {

                }

                @Override
                public void onError(@NonNull Throwable e) {

                }
            });
}

但是它不起作用,即使我设法在 onComplete 中获得日志输出。

尝试:

道:

@Insert
Completable insertItems(List<Items> items);

存储库:

public void insertItems(List<Items> items){ 
    prjDao.insertItems(items))
        .subscribeOn(Schedulers.io())
        .observeOn(AndroidSchedulers.mainThread())
        .subscribe(...);
}

或者更好:

存储库:

public Completable insertItems(List<Items> items){ 
    return prjDao.insertItems(items))
}

然后,订阅可完成的并处理您实际调用的订阅回调 insertItems()

insertItems(items)
    .subscribeOn(Schedulers.io())
    .observeOn(AndroidSchedulers.mainThread())
    .subscribe(...);

在我看来,存储库应该只提供到数据库接口的桥梁,调用者应该是处理订阅回调的人,因为每个调用者可能希望以不同的方式处理回调。

更新

要在 room 中使用 rxjava,请检查您的 build.gradle 文件中是否包含所有需要的依赖项:

implementation "androidx.room:room-runtime:[roomVersion]"
implementation "androidx.room:room-rxjava2:[roomVersion]"
annotationProcessor "androidx.room:room-compiler:[roomVersion]"

我目前使用 roomVersion 2.2.5

这是我刚刚创建的 room + rxjava 的简单工作演示,也许您会发现其中的不同之处:

https://github.com/phamtdat/RxRoomDemo