개조 된 2 개 + RxJava2 + 데이터 바인딩 라이브러리를 사용합니다.Android 데이터 바인딩이 RxJava2와 작동하지 않습니다
API 호출을 수행 할 때 진행률 표시 줄을 업데이트하고 싶습니다.
onNext/onError/onCompleted 콜백에서 모델이 수정되면보기가 업데이트되지 않습니다. 수신 거부에서 작동합니다. 모델을 수정하는 코드 라인이 실행됩니다. 무엇이 문제일까요?
모델 클래스 + 일부 헬퍼
public class RxUtils {
public static <T> ObservableTransformer<T, T> applyApiSchedulers() {
return new ObservableTransformer<T, T>() {
@Override
public ObservableSource<T> apply(@NonNull Observable<T> upstream) {
return upstream.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread());
}
};
}
}
public class CompanyActivityModel extends BaseObservableModel {
private boolean isLoading = false;
private final ArrayList<Company> companies;
public CompanyActivityModel() {
this.companies = new ArrayList<>();
}
@Bindable
public boolean isLoading() {
return isLoading;
}
public void setLoading(boolean loading) {
isLoading = loading;
notifyPropertyChanged(BR.isVisible);
}
public ArrayList<Company> getCompanies() {
return companies;
}
}
public class BaseObservableModel extends BaseObservable {
}
진행 바 레이아웃 + 활동 레이아웃
<data>
<import type="android.view.View"/>
<variable
name="isVisible"
type="boolean"/>
</data>
<RelativeLayout
android:visibility="@{isVisible ? View.VISIBLE : View.GONE}"
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="#FFFFFF">
<ProgressBar
android:layout_centerInParent="true"
android:layout_width="wrap_content"
android:layout_height="wrap_content"/>
</RelativeLayout>
</layout>
<?xml version="1.0" encoding="utf-8"?>
<layout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:bind="http://schemas.android.com/tools">
<data>
<variable
name="model"
type=".CompanyActivityModel"/>
</data>
<RelativeLayout
android:layout_width="match_parent"
android:layout_height="match_parent">
<android.support.v7.widget.RecyclerView
android:id="@+id/rv_companies"
android:layout_width="match_parent"
android:layout_height="match_parent"/>
<include
app:isVisible = "@{model.loading}"
layout="@layout/layout_progress_bar"/>
</RelativeLayout>
</layout>
API 호출
apiService.getAllCompanies(null)
.compose(RxUtils.applyApiSchedulers())
.subscribe(new Observer<GetAllCompaniesResponse>() {
@Override
public void onSubscribe(@NonNull Disposable d) {
getModel().setLoading(true);
}
@Override
public void onNext(@NonNull GetAllCompaniesResponse getAllCompaniesResponse) {
if(!getAllCompaniesResponse.hasError()) {
companyDao.insertCompanies(getAllCompaniesResponse.getResult());
}
getModel().setLoading(false);
}
@Override
public void onError(@NonNull Throwable e) {
getModel().setLoading(false);
}
@Override
public void onComplete() {
getModel().setLoading(false);
loadCompaniesFromDB();
}
});