2017-05-04 7 views
0

Ich benutze Retrofit 2 + RxJava2 + Databinding-Bibliothek.Android Databinding funktioniert nicht mit RxJava2

Ich möchte die Sichtbarkeit der Fortschrittsleiste aktualisieren, wenn ich einen API-Anruf durchführe.

Wenn das Modell in OnNext/onError/onCompleted Callbacks geändert wird, wird die Ansicht nicht aktualisiert. In abbonieren funktioniert es. Die Codezeilen, in denen ich das Modell ändere, werden ausgeführt. Was könnte das Problem sein?

Modellklasse + einige Helfer

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 { 
} 

Fortschrittsbalken-Layout + Aktivität Layout

<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> 

der API-Aufruf

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

Antwort

Verwandte Themen