Skip to content

Commit

Permalink
port MVP-fragment example to RxJava2
Browse files Browse the repository at this point in the history
  • Loading branch information
Zhuinden committed Apr 9, 2017
1 parent bcfb25e commit 01aef8c
Show file tree
Hide file tree
Showing 12 changed files with 135 additions and 148 deletions.
8 changes: 4 additions & 4 deletions simple-stack-example-fragments/build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -49,10 +49,10 @@ dependencies {
compile 'com.google.dagger:dagger:2.8'
provided 'org.glassfish:javax.annotation:10.0-b28'

compile 'io.reactivex:rxjava:1.2.5'
compile 'io.reactivex:rxandroid:1.2.1'
compile 'com.jakewharton.rxbinding:rxbinding:1.0.0'
compile 'com.jakewharton.rxrelay:rxrelay:1.2.0'
compile "io.reactivex.rxjava2:rxjava:2.0.8"
compile 'io.reactivex.rxjava2:rxandroid:2.0.1'
compile 'com.jakewharton.rxbinding2:rxbinding:2.0.0'
compile 'com.jakewharton.rxrelay2:rxrelay:2.0.0'

apt 'dk.ilios:realmfieldnameshelper:1.1.0'

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,7 @@
import javax.inject.Inject;
import javax.inject.Named;

import rx.android.schedulers.AndroidSchedulers;
import io.reactivex.android.schedulers.AndroidSchedulers;

/**
* Created by Owner on 2017. 01. 26..
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@

import dagger.Module;
import dagger.Provides;
import rx.schedulers.Schedulers;
import io.reactivex.schedulers.Schedulers;

/**
* Created by Owner on 2017. 01. 26..
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -8,13 +8,14 @@
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;
import rx.Observable;
import rx.Subscriber;
import rx.Subscription;
import rx.subscriptions.Subscriptions;


/**
* Created by Owner on 2017. 01. 26..
Expand All @@ -37,32 +38,29 @@ public void init(Context context) {
Realm.setDefaultConfiguration(realmConfiguration);
}

Subscription subscription;
Disposable disposable;

public void openDatabase() {
subscription = Observable.create(new Observable.OnSubscribe<Realm>() {
@Override
public void call(final Subscriber<? super Realm> subscriber) {
final Realm observableRealm = Realm.getDefaultInstance();
final RealmChangeListener<Realm> listener = realm -> {
if(!subscriber.isUnsubscribed()) {
subscriber.onNext(observableRealm);
}
};
observableRealm.addChangeListener(listener);
subscriber.add(Subscriptions.create(() -> {
observableRealm.removeChangeListener(listener);
observableRealm.close();
}));
subscriber.onNext(observableRealm);
}
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(subscription != null && !subscription.isUnsubscribed()) {
subscription.unsubscribe();
subscription = null;
if(disposable != null && !disposable.isDisposed()) {
disposable.dispose();
disposable = null;
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -15,14 +15,17 @@
import javax.inject.Named;
import javax.inject.Singleton;

import io.reactivex.Observable;
import io.reactivex.ObservableEmitter;
import io.reactivex.ObservableOnSubscribe;
import io.reactivex.Single;
import io.reactivex.SingleOnSubscribe;
import io.reactivex.annotations.NonNull;
import io.reactivex.disposables.Disposables;
import io.realm.Realm;
import io.realm.RealmChangeListener;
import io.realm.RealmResults;
import io.realm.Sort;
import rx.Observable;
import rx.Single;
import rx.Subscriber;
import rx.subscriptions.Subscriptions;

/**
* Created by Owner on 2017. 01. 26..
Expand All @@ -44,115 +47,95 @@ public class TaskRepository {
public TaskRepository() {
}

public Observable<List<Task>> getTasks() {
return Observable.create(new Observable.OnSubscribe<List<Task>>() {
private List<Task> mapFrom(RealmResults<DbTask> dbTasks) {
List<Task> tasks = new ArrayList<>(dbTasks.size());
for(DbTask dbTask : dbTasks) {
tasks.add(taskMapper.fromRealm(dbTask));
}
return tasks;
}
private List<Task> mapFrom(RealmResults<DbTask> dbTasks) {
List<Task> tasks = new ArrayList<>(dbTasks.size());
for(DbTask dbTask : dbTasks) {
tasks.add(taskMapper.fromRealm(dbTask));
}
return tasks;
}

@Override
public void call(final Subscriber<? super List<Task>> subscriber) {
Realm realm = Realm.getDefaultInstance();
final RealmResults<DbTask> dbTasks = realm.where(DbTask.class).findAllSorted(DbTaskFields.ID, Sort.ASCENDING);
final RealmChangeListener<RealmResults<DbTask>> realmChangeListener = element -> {
if(!subscriber.isUnsubscribed()) {
List<Task> tasks = mapFrom(element);
if(!subscriber.isUnsubscribed()) {
subscriber.onNext(tasks);
}
}
};
subscriber.add(Subscriptions.create(() -> {
if(dbTasks.isValid()) {
dbTasks.removeChangeListener(realmChangeListener);
public Observable<List<Task>> getTasks() {
return Observable.create((ObservableOnSubscribe<List<Task>>) emitter -> {
Realm realm = Realm.getDefaultInstance();
final RealmResults<DbTask> dbTasks = realm.where(DbTask.class)
.findAllSorted(DbTaskFields.ID, Sort.ASCENDING);
final RealmChangeListener<RealmResults<DbTask>> realmChangeListener = element -> {
if(!emitter.isDisposed()) {
List<Task> tasks = mapFrom(element);
if(!emitter.isDisposed()) {
emitter.onNext(tasks);
}
realm.close();
}));
dbTasks.addChangeListener(realmChangeListener);
subscriber.onNext(mapFrom(dbTasks));
}
}
};
emitter.setDisposable(Disposables.fromAction(() -> {
if(dbTasks.isValid()) {
dbTasks.removeChangeListener(realmChangeListener);
}
realm.close();
}));
dbTasks.addChangeListener(realmChangeListener);
emitter.onNext(mapFrom(dbTasks));
}).subscribeOn(looperScheduler.getScheduler()).unsubscribeOn(looperScheduler.getScheduler());
}

public Observable<List<Task>> getCompletedTasks() {
return Observable.create(new Observable.OnSubscribe<List<Task>>() {
private List<Task> mapFrom(RealmResults<DbTask> dbTasks) {
List<Task> tasks = new ArrayList<>(dbTasks.size());
for(DbTask dbTask : dbTasks) {
tasks.add(taskMapper.fromRealm(dbTask));
}
return tasks;
}

@Override
public void call(final Subscriber<? super List<Task>> subscriber) {
Realm realm = Realm.getDefaultInstance();
final RealmResults<DbTask> dbTasks = realm.where(DbTask.class)
.equalTo(DbTaskFields.COMPLETED, true)
.findAllSorted(DbTaskFields.ID, Sort.ASCENDING);
final RealmChangeListener<RealmResults<DbTask>> realmChangeListener = element -> {
if(!subscriber.isUnsubscribed()) {
List<Task> tasks = mapFrom(element);
if(!subscriber.isUnsubscribed()) {
subscriber.onNext(tasks);
}
}
};
subscriber.add(Subscriptions.create(() -> {
if(dbTasks.isValid()) {
dbTasks.removeChangeListener(realmChangeListener);
return Observable.create((ObservableOnSubscribe<List<Task>>) emitter -> {
Realm realm = Realm.getDefaultInstance();
final RealmResults<DbTask> dbTasks = realm.where(DbTask.class)
.equalTo(DbTaskFields.COMPLETED, true)
.findAllSorted(DbTaskFields.ID, Sort.ASCENDING);
final RealmChangeListener<RealmResults<DbTask>> realmChangeListener = element -> {
if(!emitter.isDisposed()) {
List<Task> tasks = mapFrom(element);
if(!emitter.isDisposed()) {
emitter.onNext(tasks);
}
realm.close();
}));
dbTasks.addChangeListener(realmChangeListener);
subscriber.onNext(mapFrom(dbTasks));
}
}
};
emitter.setDisposable(Disposables.fromAction(() -> {
if(dbTasks.isValid()) {
dbTasks.removeChangeListener(realmChangeListener);
}
realm.close();
}));
dbTasks.addChangeListener(realmChangeListener);
emitter.onNext(mapFrom(dbTasks));
}).subscribeOn(looperScheduler.getScheduler()).unsubscribeOn(looperScheduler.getScheduler());
}

public Observable<List<Task>> getActiveTasks() {
return Observable.create(new Observable.OnSubscribe<List<Task>>() {
private List<Task> mapFrom(RealmResults<DbTask> dbTasks) {
List<Task> tasks = new ArrayList<>(dbTasks.size());
for(DbTask dbTask : dbTasks) {
tasks.add(taskMapper.fromRealm(dbTask));
}
return tasks;
}

return Observable.create(new ObservableOnSubscribe<List<Task>>() {
@Override
public void call(final Subscriber<? super List<Task>> subscriber) {
public void subscribe(@NonNull ObservableEmitter<List<Task>> emitter)
throws Exception {
Realm realm = Realm.getDefaultInstance();
final RealmResults<DbTask> dbTasks = realm.where(DbTask.class)
.equalTo(DbTaskFields.COMPLETED, false)
.findAllSorted(DbTaskFields.ID, Sort.ASCENDING);
final RealmChangeListener<RealmResults<DbTask>> realmChangeListener = element -> {
if(!subscriber.isUnsubscribed()) {
if(!emitter.isDisposed()) {
List<Task> tasks = mapFrom(element);
if(!subscriber.isUnsubscribed()) {
subscriber.onNext(tasks);
if(!emitter.isDisposed()) {
emitter.onNext(tasks);
}
}
};
subscriber.add(Subscriptions.create(() -> {
emitter.setDisposable(Disposables.fromAction(() -> {
if(dbTasks.isValid()) {
dbTasks.removeChangeListener(realmChangeListener);
}
realm.close();
}));
dbTasks.addChangeListener(realmChangeListener);
subscriber.onNext(mapFrom(dbTasks));
emitter.onNext(mapFrom(dbTasks));
}
}).subscribeOn(looperScheduler.getScheduler()).unsubscribeOn(looperScheduler.getScheduler());
}

@SuppressWarnings("NewApi")
public void insertTask(Task task) {
Single.create((Single.OnSubscribe<Void>) singleSubscriber -> {
Single.create((SingleOnSubscribe<Void>) singleSubscriber -> {
try(Realm r = Realm.getDefaultInstance()) {
r.executeTransaction(realm -> {
realm.insertOrUpdate(taskMapper.toRealm(task));
Expand All @@ -163,7 +146,7 @@ public void insertTask(Task task) {

@SuppressWarnings("NewApi")
public void insertTasks(List<Task> tasks) {
Single.create((Single.OnSubscribe<Void>) singleSubscriber -> {
Single.create((SingleOnSubscribe<Void>) singleSubscriber -> {
try(Realm r = Realm.getDefaultInstance()) {
List<DbTask> dbTasks = new ArrayList<>(tasks.size());
for(Task task : tasks) {
Expand All @@ -178,7 +161,7 @@ public void insertTasks(List<Task> tasks) {

@SuppressWarnings("NewApi")
public void deleteCompletedTasks() {
Single.create((Single.OnSubscribe<Void>) singleSubscriber -> {
Single.create((SingleOnSubscribe<Void>) singleSubscriber -> {
try(Realm r = Realm.getDefaultInstance()) {
r.executeTransaction(realm -> realm.where(DbTask.class)
.equalTo(DbTaskFields.COMPLETED, true)
Expand Down Expand Up @@ -216,9 +199,12 @@ public void setTaskActive(Task task) {

@SuppressWarnings("NewApi")
public void deleteTask(Task task) {
Single.create((Single.OnSubscribe<Void>) singleSubscriber -> {
Single.create((SingleOnSubscribe<Void>) singleSubscriber -> {
try(Realm r = Realm.getDefaultInstance()) {
r.executeTransaction(realm -> realm.where(DbTask.class).equalTo(DbTaskFields.ID, task.id()).findAll().deleteAllFromRealm());
r.executeTransaction(realm -> realm.where(DbTask.class)
.equalTo(DbTaskFields.ID, task.id())
.findAll()
.deleteAllFromRealm());
}
}).subscribeOn(writeScheduler.getScheduler()).subscribe();
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,7 @@

import javax.inject.Inject;

import rx.android.schedulers.AndroidSchedulers;
import io.reactivex.android.schedulers.AndroidSchedulers;

/**
* Created by Owner on 2017. 01. 27..
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -13,10 +13,10 @@

import javax.inject.Inject;

import rx.Observable;
import rx.Subscription;
import rx.android.schedulers.AndroidSchedulers;
import rx.schedulers.Schedulers;
import io.reactivex.Observable;
import io.reactivex.android.schedulers.AndroidSchedulers;
import io.reactivex.disposables.Disposable;
import io.reactivex.schedulers.Schedulers;

/**
* Created by Owner on 2017. 01. 27..
Expand All @@ -31,11 +31,11 @@ public StatisticsPresenter() {
@Inject
TaskRepository tasksRepository;

Subscription subscription;
Disposable disposable;

@Override
protected void onAttach(StatisticsFragment coordinator) {
subscription = Observable.combineLatest(tasksRepository.getActiveTasks(), //
disposable = Observable.combineLatest(tasksRepository.getActiveTasks(), //
tasksRepository.getCompletedTasks(), //
(activeTasks, completedTasks) -> Pair.with(activeTasks, completedTasks)) //
.subscribeOn(Schedulers.computation())
Expand All @@ -51,7 +51,7 @@ protected void onAttach(StatisticsFragment coordinator) {

@Override
protected void onDetach(StatisticsFragment coordinator) {
subscription.unsubscribe();
disposable.dispose();
}

@Override
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,7 @@

import javax.inject.Inject;

import rx.android.schedulers.AndroidSchedulers;
import io.reactivex.android.schedulers.AndroidSchedulers;

/**
* Created by Owner on 2017. 01. 27..
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -23,7 +23,8 @@

import java.util.List;

import rx.Observable;
import io.reactivex.Observable;


/**
* Used with the filter spinner in the tasks list.
Expand Down

0 comments on commit 01aef8c

Please sign in to comment.