Android 数据绑定不适用于 RxJava2
Android Databinding not working with RxJava2
我使用改造 2 + RxJava2 + 数据绑定库。
我想在执行 api 调用时更新进度条可见性。
在 onNext/onError/onCompleted 回调中修改模型时,视图不会更新。在 onsubscribe 它有效。执行我修改模型的代码行。可能是什么问题?
模特class + 一些帮手
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 {
}
进度条布局+Activity布局
<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();
}
});
notifyPropertyChanged(BR.isVisible);
BR 值是根据 @Bindable
注释生成的,而不是布局中的名称 XML。所以你告诉数据绑定库正在更新错误的变量。
BR.loading
可能是应该提供的正确值。
来源:https://developer.android.com/topic/libraries/data-binding/index.html#observable_objects
我使用改造 2 + RxJava2 + 数据绑定库。
我想在执行 api 调用时更新进度条可见性。
在 onNext/onError/onCompleted 回调中修改模型时,视图不会更新。在 onsubscribe 它有效。执行我修改模型的代码行。可能是什么问题?
模特class + 一些帮手
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 {
}
进度条布局+Activity布局
<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();
}
});
notifyPropertyChanged(BR.isVisible);
BR 值是根据 @Bindable
注释生成的,而不是布局中的名称 XML。所以你告诉数据绑定库正在更新错误的变量。
BR.loading
可能是应该提供的正确值。
来源:https://developer.android.com/topic/libraries/data-binding/index.html#observable_objects