2017-11-02 23 views
0

ローカルデータベース(SugarORM)を使用していますが、データベースが変更されたときにUIを更新するためにRXJavaを実装しています。データ変更時にUIが更新されない

活動が開始されると、それは新しいオブザーバーをサブスクライブ:私のプレゼンタークラスで

@Override //This is happening inside doInBackground ! 
public void onLoading() { 
    presenter.getRxProducts().subscribe(new Observer<List<Product>>() { 
     @Override 
     public void onCompleted() { 

     } 

     @Override 
     public void onError(Throwable e) { 

     } 

     @Override 
     public void onNext(List<Product> products) { 
      adapter = new SimpleProductAdapter(getApplicationContext(), R.layout.row_simple_product, 
        products); 
     } 
    }); 

} 

@Override //This happens inside onPostExecute() ! 
public void onLoadingComplete() { 
    lvProducts.setAdapter(adapter); 
    super.onLoadingComplete(); 
} 

、メソッドgetRxProductsは、次のようになります。

public Observable<List<Product>> getRxProducts(){ 
    return Observable.fromCallable(new Callable<List<Product>>(){ 
     @Override 
     public List<Product> call() throws Exception { 
      return getAllProducts(Product.Sorting.NONE); //This returns a List<Product> object. 
     } 
    }); 
} 

データは、UIで[OK]を探しますObservable<List<Product>>のいずれかの要素に変更を加えても、UIに変更はありません。私は私が行方不明になることができますか?

+0

メインのUIスレッドをブロックしないように '.subscribeOn(Schedulers.io())&.observeOn(AndroidSchedulers.mainThread())'する必要があります。また、私は、アクティビティのonCreateのlistview/recyclerviewにアダプタを設定し、アダプタの 'notifyDataSetChanged()'を呼び出します – Raghunandan

答えて

1

を呼び出します。 UIを定期的に更新したい場合は、実装する必要があると思います。

1

は、既存のアダプタであなたのListView/RecyclerViewまたは更新データに新しいアダプタを接続し、あなたのストリームに.subscribeOn(Schedulers.io()) & .observeOn(AndroidSchedulers.mainThread())を追加してみnotifyDataSetChanged()

+0

新しいアダプタはどこに貼り付けますか? onNext()の中に? – chntgomez

+0

よろしいですが、それがAndroidのメインスレッドにあるかどうかを確認するか、他の回答 – Tuby

関連する問題