package com.zhuinden.simplestackdemoexamplefragments.data.manager; import android.content.Context; import com.zhuinden.simplestackdemoexamplefragments.util.SchedulerHolder; import javax.inject.Inject; import javax.inject.Named; import javax.inject.Singleton; import io.reactivex.Observable; import io.reactivex.ObservableOnSubscribe; import io.reactivex.disposables.Disposable; import io.reactivex.disposables.Disposables; import io.realm.Realm; import io.realm.RealmChangeListener; import io.realm.RealmConfiguration; /** * Created by Owner on 2017. 01. 26.. */ @Singleton public class DatabaseManager { @Inject public DatabaseManager() { } @Inject @Named("LOOPER_SCHEDULER") SchedulerHolder looperScheduler; private static final String TAG = "DatabaseManager"; public void init(Context context) { Realm.init(context); RealmConfiguration realmConfiguration = new RealmConfiguration.Builder().deleteRealmIfMigrationNeeded().build(); Realm.setDefaultConfiguration(realmConfiguration); } Disposable disposable; public void openDatabase() { disposable = Observable.create((ObservableOnSubscribe<Realm>) emitter -> { final Realm observableRealm = Realm.getDefaultInstance(); final RealmChangeListener<Realm> listener = realm -> { if(!emitter.isDisposed()) { emitter.onNext(observableRealm); } }; observableRealm.addChangeListener(listener); emitter.setDisposable(Disposables.fromAction(() -> { observableRealm.removeChangeListener(listener); observableRealm.close(); })); emitter.onNext(observableRealm); }).subscribeOn(looperScheduler.getScheduler()).unsubscribeOn(looperScheduler.getScheduler()).subscribe(); } public void closeDatabase() { if(disposable != null && !disposable.isDisposed()) { disposable.dispose(); disposable = null; } } }