[英]Asynchronous read / write to Realm using RXJava 2
My first implementation of an asynchronous operation using RXJava 2
我第一次使用
RXJava 2
实现异步操作
Goal: 目标:
Get json
data from the server with library Retrofit2
. 使用
Retrofit2
库从服务器获取json
数据。 If successful, then write the data to Realm
and immediately after the record get the data back and send to the adapter of RecyclerView
. 如果成功,则将数据写入
Realm
并在记录之后立即取回数据并将其发送到RecyclerView
的适配器。
So, I realized all this in this way: 因此,我以这种方式意识到了这一切:
private void fetchChatsFromNetwork(int count, AccessDataModel accessDataModel) {
String accessToken = accessDataModel.getAccessToken();
MyApplication.getRestApi().getChats(count, accessToken, Constants.api_version)
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribeWith(new DisposableSubscriber<ChatsModel>() {
@Override
public void onNext(ChatsModel chatsModel) {
if (chatsRepository.hasData()) {
chatsRepository.updateChatsData(chatsModel)
.subscribe(new DisposableObserver<ChatsModel>() {
@Override
public void onNext(ChatsModel localChatsModel) {
Log.d(TAG, "DO, onSuccess updated!");
iGetChatsCallback.onGetChatsSuccess(localChatsModel);
}
@Override
public void onError(Throwable e) {
Log.d(TAG, "DO, onError when update!");
iGetChatsCallback.onGetChatsError(e.getMessage());
}
@Override
public void onComplete() {
dispose();
Log.d(TAG, "DO, onComplete!");
}
});
} else {
chatsRepository.insertChatsData(chatsModel)
.subscribe(new DisposableObserver<ChatsModel>() {
@Override
public void onNext(ChatsModel localChatsModel) {
iGetChatsCallback.onGetChatsSuccess(localChatsModel);
Log.d(TAG, "DO, onSuccess inserted!");
}
@Override
public void onError(Throwable e) {
iGetChatsCallback.onGetChatsError(e.getMessage());
Log.d(TAG, "DO, onError when inserting!");
}
@Override
public void onComplete() {
dispose();
Log.d(TAG, "DO, onComplete!");
}
});
}
}
@Override
public void onError(Throwable t) {
Log.d(TAG, "onError" + t.getMessage());
}
@Override
public void onComplete() {
Log.d(TAG, "onComplete");
}
});
}
I write the data in Realm
in the onNext()
method of the subscriber MyApplication.getRestApi().GetChats()
我在订阅者
MyApplication.getRestApi().GetChats()
的onNext()
方法中将数据写入Realm
中MyApplication.getRestApi().GetChats()
Here is the entry code: 这是输入代码:
public Observable<ChatsModel> updateChatsData(final ChatsModel chatsModel) {
return Observable.create(new ObservableOnSubscribe<ChatsModel>() {
@Override
public void subscribe(ObservableEmitter<ChatsModel> e) throws Exception {
if (chatsModel != null) {
realm.executeTransactionAsync(
realm -> realm.copyToRealmOrUpdate(chatsModel),
() -> {
Log.d(LOG_TAG, "Data success updated!");
ChatsModel localChatsModel = getAllChatsData();
e.onNext(localChatsModel);
e.onComplete();
},
error -> {
Log.d(LOG_TAG, "Update data failed!");
e.onError(error);
});
}
}
});
}
The updateChatsData()
writes asynchronously and declared in another class. updateChatsData()
异步编写并在另一个类中声明。
As you can see, the fetchChatsFromNetwork()
method is written cumbersome or so it seems to me 如您所见,
fetchChatsFromNetwork()
方法的编写很繁琐,所以在我看来
Question: 题:
Whether I am doing right or not, if not, how would that be correct? 我是否做对了,如果做错了,那将是正确的吗?
private void fetchChatsFromNetwork(int count, AccessDataModel accessDataModel) {
String accessToken = accessDataModel.getAccessToken();
Single<ChatsModel> chats = MyApplication.getRestApi().getChats(count, accessToken, Constants.api_version);
chats.doOnNext((chats) -> {
chatsRepository.insertOrUpdate(chats);
}).subscribeOn(Schedulers.io())
.subscribe();
}
And 和
public void updateChatsData(final ChatsModel chatsModel) {
try(Realm realm = Realm.getDefaultInstance()) {
realm.executeTransaction(r -> {
r.insertOrUpdate(chatsModel);
});
}
}
And 和
public Flowable<List<ChatsModel>> getAllChatsData(Realm realm) {
RealmQuery<ChatsModel> query = realm.where(ChatsModel.class);
if(realm.isAutoRefresh()) {
return query.findAllAsync().asFlowable().filter(RealmResults::isLoaded);
} else {
return Flowable.just(query.findAll());
}
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.