C'est le ViewModel où les transactions Rx sont appeléesComment empêcher le problème Realm Threading lors de l'utilisation d'un appel Realm dans une transaction Rx Observable?
RealmHelperRepo est la mise en œuvre de l'interface HelperRepo
@PerActivity
public class RoleSelectionViewModel extends BaseViewModel<RoleSelectionMvvm.View> implements RoleSelectionMvvm.ViewModel {
private Disposable roleGroupSubscription;
@Inject
public RoleSelectionViewModel(@AppContext Context context, HelperRepo helperRepo, ApiOAuth2 ApiOAuth2) {
this.mContext = context;
this.mUserRepo = userRepo;
this.mHelperRepo = helperRepo;
ApiOAuth2.initialize();
this.mApiOAuth2 = ApiOAuth2;
this.mCurrentUser = mUserRepo.getByField("isLoggedIn", true, true);
if (mCurrentUser != null) {
this.mCurrentUserId = mCurrentUser.getId();
this.mHelper = mHelperRepo.getByField("user.id", mCurrentUserId, true);
}
Observable<Response<ResponseHelper>> postHelperObservable = mApiOAuth2.postHelperRX(new Helper());
Observable<Response<ResponseHelper>> getHelperObservable = mApiOAuth2.getHelperRX(mCurrentUserId);
roleGroupSubscription = postRoleGroupsObservable
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.flatMap((response) -> {
if (response.isSuccessful()) {
ResponseHelper responseHelper = response.body();
mHelper = responseHelper.getHelper();
return Observable.just(mHelper);
} else if (response.code() == 409) {
// handle POST conflict (i.e. helper already exists)
return getHelperObservable;
}
})
.subscribe((data) -> {
if (data instanceof Response<?>) {
// data came from getHelperObservable
Response response = (Response) data;
if (!response.isSuccessful()) {
ResponseHelper responseHelper = (ResponseHelper) response.body();
mHelper = responseHelper.getHelper();
else {
// data came from Observable.just(helper)
mApiOAuth2.getHelperRX(mCurrentUserId).subscribe(
responseHelperResponse -> {
if (responseHelperResponse.isSuccessful()) {
String helperID = responseHelperResponse.body().getHelper().getId();
Log.d("RealmCount", "save: " + Realm.getLocalInstanceCount(realmProvider.get().getConfiguration()));
mHelper.setId(helperID);
mHelper.setUser(mCurrentUser);
--------> // when mHelperRepo.save(mHelper) is called, it goes to RealmHelperRepo to save and
--------> // thus triggering mRealm.executeTransaction causing Realm threading
mHelperRepo.save(mHelper);
}
saveAndBegin();
},
Throwable::printStackTrace);
});
C'est la classe RealmRepo où les appels de royaume sont faits.
@PerApplication
public class RealmHelperRepo implements HelperRepo {
private final Provider<Realm> mRealmProvider;
private Realm mRealm;
@Inject
public RealmHelperRepo(Provider<Realm> realmProvider) {
this.mRealmProvider = realmProvider;
this.mRealm = mRealmProvider.get();
}
@Override
public void save(Helper helper) {
if (mRealm != null) {
---------> // code runs into threading issue here when a realmThread executeTransaction is called
mRealm.executeTransaction(r -> r.copyToRealmOrUpdate(helper));
}
}
Y at-il quelque chose qui me manque ici? Autres fonctions Rx que je devrais utiliser au lieu de flatmap? Existe-t-il d'autres moyens de sauvegarder mes données observables sans rencontrer de problème de threading? Aidez-moi!
merci pour la clarification! va travailler dessus :) –
sauveteur merci !! –