이는 수신 거래 Rx Observable 트랜잭션 내에서 영역 호출을 사용할 때 영역 스레딩 문제를 방지하려면 어떻게해야합니까?
RealmHelperRepo
이라고 뷰 모델이다는 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);
});
이 영역 호출이 만들어지는 RealmRepo의 클래스의 구현입니다.
@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));
}
}
내가 여기에 뭔가가 있습니까? 다른 Rx 함수를 flatmap 대신 사용해야합니까? 스레딩 문제에 빠지지 않고 관찰 가능한 데이터를 저장하는 다른 방법이 있습니까? 도움!
설명해 주셔서 감사합니다. 그것에 작동합니다 :) –
생명의 은인 감사합니다! –