0
我使用了retrofit 2 + RxJava2 + Databinding庫。Android數據綁定不能與RxJava2一起使用
我想在執行api調用時更新進度欄可見性。
當模型在onNext/onError/onCompleted回調中修改時,視圖不會更新。在訂閱它的作品。我修改模型的代碼行被執行。可能是什麼問題?
Model類+一些助手
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();
}
});