将 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 的简单工作演示,也许您会发现其中的不同之处:
我正在尝试用 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 的简单工作演示,也许您会发现其中的不同之处: