2017-05-04 3 views
0

개조 된 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(); 
        } 
       }); 

답변