Android Databinding无法与RxJava2一起使用

时间:2017-05-04 14:29:27

标签: android retrofit2 android-databinding rx-java2

我使用改造2 + 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();
                    }
                });

1 个答案:

答案 0 :(得分:0)

ln -s

BR值是根据notifyPropertyChanged(BR.isVisible);注释生成的,而不是布局XML中的名称。所以你告诉数据绑定库错误的变量正在更新。

@Bindable可能是应该提供的正确值。

来源:Charles Duffy