2017-11-07 4 views
1

RealmがasFlowable機能を導入したRxJava 2をサポートしていることにとても興奮しています。RxJavaとRealmを使用してローカルデータソースを構造化するにはどうすればよいですか?

私が直面している問題は、ローカルデータソースシングルトンクラスの領域インスタンスのライフサイクルを最適に管理する方法です。私のローカルデータソースは、Androidアーキテクチャサンプルhereに似ています。 RxJavaのRealmの例では、onCreateで領域インスタンスをインスタンス化し、アクティビティのonDestroyでインスタンスインスタンスを閉じます。しかし、ローカルデータソースはシングルトンなので、これらのライフサイクルイベントをインスタンス化してインスタンスを閉じることはできません。

問題は、シングルトンが作成されるたびにレルムインスタンスをインスタンス化し、シングルトンが破棄された場合にのみ閉じるか、アクティビティ/フラグメント内のレルムインスタンスをインスタンス化してローカルデータソースに注入するか、アクティビティ/フラグメントでそれを閉じますか? 他の提案は大歓迎です。ありがとう!

答えて

1

彼らはのonCreateでレルムのインスタンスをインスタンス化のonDestroyでそれを閉じますアクティビティ

これは、UIスレッドのRealm用です。

あなたが受け取るRealmインスタンスがスレッドローカル参照カウントインスタンスではなく、「スレッドセーフ」シングルトンローカルデータソース

にそれを注入します。したがって、おそらくRealmを直接注入するべきではありません。その場合、特定のスレッドに限定されます。レルムはRealmResultsが有効である場合にのみ通知を提供するため、


は、一般的にUIスレッドレルムは、レルムのインスタンスが開いていることを意味する、ViewModelretained fragmentonCreate()/onDestroy()とすべてのことによって管理することができます。あなたが見ることができるように

だから、どのスレッドでRealmResultsを露出させ、それがRealmResultsであるという事実のとらわれない、あなたは

public Flowable<List<ChatsModel>> getAllChatsData(Realm realm) { 
    RealmQuery<ChatsModel> query = realm.where(ChatsModel.class); 
    if(realm.isAutoRefresh()) { 
     return query.findAllAsync().asFlowable().filter(RealmResults::isLoaded); 
    } else { 
     return Flowable.just(query.findAll()); 
    } 
} 

を行う必要があるだろう、これはその入力としてRealmインスタンスを受け取ります。そのパラメータを削除したい場合は、ローカルデータソースから公開しているもので参照カウントを非表示にする必要があります。LiveDataは、onActive()/onInactive()コールバック。

​​

次にあなたがLiveDataを公開することができます:

public class MyDao { 
    public LiveData<List<MyObject>> findMyObjectsWithChanges() { 
     return new RealmLiveData<MyObject>(new QueryDefinition<MyObject>() { 
      @Override 
      public RealmResults<MyObject> createResults(Realm realm) { 
       return realm.where(MyObject).findAllAsync(); 
      } 
     }); 
    } 
} 

ラムダ式は、だから、に探して価値がある可能性があります多くのよりよい

public class MyDao { 
    public LiveData<List<MyObject>> findMyObjectsWithChanges() { 
     return new RealmLiveData<MyObject>((realm) -> realm.where(MyObject.class).findAllAsync()); 
    } 
} 

ことを確認してください。

1

UIスレッドでRealmファイルを閉じることは自動的に最新の状態に保たれるため、必ずしも危険ではないことに注意してください。唯一の欠点は、ファイルを完全に閉じる必要がある機能(たとえば削除など)を使用できなくなることです。

個人的には、センサーやGPSの制御など、他のものに必要なライフサイクルイベントがモデルレイヤーに含まれていると思います。

特に今アーキテクチャのコンポーネントは、レルムのインスタンスを制御するための手段として、私はLifecycleObservable見て推薦1.0に達したことを:https://developer.android.com/topic/libraries/architecture/lifecycle.html

関連する問題