Migrate to RxJava 2.

This commit is contained in:
Fernando Cejas
2016-12-23 16:57:10 -03:00
parent ca067b1006
commit 729ec11cca
24 changed files with 134 additions and 116 deletions

View File

@@ -15,8 +15,8 @@ ext {
daggerVersion = '2.8'
butterKnifeVersion = '7.0.1'
recyclerViewVersion = '21.0.3'
rxJavaVersion = '1.0.14'
rxAndroidVersion = '1.0.1'
rxJavaVersion = '2.0.2'
rxAndroidVersion = '2.0.1'
javaxAnnotationVersion = '1.0'
javaxInjectVersion = '1'
gsonVersion = '2.3'
@@ -41,8 +41,8 @@ ext {
dagger: "com.google.dagger:dagger:${daggerVersion}",
butterKnife: "com.jakewharton:butterknife:${butterKnifeVersion}",
recyclerView: "com.android.support:recyclerview-v7:${recyclerViewVersion}",
rxJava: "io.reactivex:rxjava:${rxJavaVersion}",
rxAndroid: "io.reactivex:rxandroid:${rxAndroidVersion}",
rxJava: "io.reactivex.rxjava2:rxjava:${rxJavaVersion}",
rxAndroid: "io.reactivex.rxjava2:rxandroid:${rxAndroidVersion}",
javaxAnnotation: "javax.annotation:jsr250-api:${javaxAnnotationVersion}"
]
@@ -57,7 +57,7 @@ ext {
domainDependencies = [
javaxAnnotation: "javax.annotation:jsr250-api:${javaxAnnotationVersion}",
javaxInject: "javax.inject:javax.inject:${javaxInjectVersion}",
rxJava: "io.reactivex:rxjava:${rxJavaVersion}",
rxJava: "io.reactivex.rxjava2:rxjava:${rxJavaVersion}",
arrow: "com.fernandocejas:arrow:${arrowVersion}"
]
@@ -72,8 +72,8 @@ ext {
dagger: "com.google.dagger:dagger:${daggerVersion}",
okHttp: "com.squareup.okhttp:okhttp:${okHttpVersion}",
gson: "com.google.code.gson:gson:${gsonVersion}",
rxJava: "io.reactivex:rxjava:${rxJavaVersion}",
rxAndroid: "io.reactivex:rxandroid:${rxAndroidVersion}",
rxJava: "io.reactivex.rxjava2:rxjava:${rxJavaVersion}",
rxAndroid: "io.reactivex.rxjava2:rxandroid:${rxAndroidVersion}",
javaxAnnotation: "javax.annotation:jsr250-api:${javaxAnnotationVersion}",
javaxInject: "javax.inject:javax.inject:${javaxInjectVersion}",
androidAnnotations: "com.android.support:support-annotations:${androidAnnotationsVersion}"

View File

@@ -16,14 +16,14 @@
package com.fernandocejas.android10.sample.data.cache;
import com.fernandocejas.android10.sample.data.entity.UserEntity;
import rx.Observable;
import io.reactivex.Observable;
/**
* An interface representing a user Cache.
*/
public interface UserCache {
/**
* Gets an {@link rx.Observable} which will emit a {@link UserEntity}.
* Gets an {@link Observable} which will emit a {@link UserEntity}.
*
* @param userId The user id to retrieve data.
*/

View File

@@ -20,10 +20,10 @@ import com.fernandocejas.android10.sample.data.cache.serializer.Serializer;
import com.fernandocejas.android10.sample.data.entity.UserEntity;
import com.fernandocejas.android10.sample.data.exception.UserNotFoundException;
import com.fernandocejas.android10.sample.domain.executor.ThreadExecutor;
import io.reactivex.Observable;
import java.io.File;
import javax.inject.Inject;
import javax.inject.Singleton;
import rx.Observable;
/**
* {@link UserCache} implementation.
@@ -63,17 +63,17 @@ public class UserCacheImpl implements UserCache {
}
@Override public Observable<UserEntity> get(final int userId) {
return Observable.create(subscriber -> {
return Observable.create(emitter -> {
final File userEntityFile = UserCacheImpl.this.buildFile(userId);
final String fileContent = UserCacheImpl.this.fileManager.readFileContent(userEntityFile);
final UserEntity userEntity =
UserCacheImpl.this.serializer.deserialize(fileContent, UserEntity.class);
if (userEntity != null) {
subscriber.onNext(userEntity);
subscriber.onCompleted();
emitter.onNext(userEntity);
emitter.onComplete();
} else {
subscriber.onError(new UserNotFoundException());
emitter.onError(new UserNotFoundException());
}
});
}

View File

@@ -16,8 +16,8 @@
package com.fernandocejas.android10.sample.data.net;
import com.fernandocejas.android10.sample.data.entity.UserEntity;
import io.reactivex.Observable;
import java.util.List;
import rx.Observable;
/**
* RestApi for retrieving data from the network.
@@ -32,12 +32,12 @@ public interface RestApi {
String API_URL_GET_USER_DETAILS = API_BASE_URL + "user_";
/**
* Retrieves an {@link rx.Observable} which will emit a List of {@link UserEntity}.
* Retrieves an {@link Observable} which will emit a List of {@link UserEntity}.
*/
Observable<List<UserEntity>> userEntityList();
/**
* Retrieves an {@link rx.Observable} which will emit a {@link UserEntity}.
* Retrieves an {@link Observable} which will emit a {@link UserEntity}.
*
* @param userId The user id used to get user data.
*/

View File

@@ -21,9 +21,9 @@ import android.net.NetworkInfo;
import com.fernandocejas.android10.sample.data.entity.UserEntity;
import com.fernandocejas.android10.sample.data.entity.mapper.UserEntityJsonMapper;
import com.fernandocejas.android10.sample.data.exception.NetworkConnectionException;
import io.reactivex.Observable;
import java.net.MalformedURLException;
import java.util.List;
import rx.Observable;
/**
* {@link RestApi} implementation for retrieving data from the network.
@@ -48,42 +48,42 @@ public class RestApiImpl implements RestApi {
}
@Override public Observable<List<UserEntity>> userEntityList() {
return Observable.create(subscriber -> {
return Observable.create(emitter -> {
if (isThereInternetConnection()) {
try {
String responseUserEntities = getUserEntitiesFromApi();
if (responseUserEntities != null) {
subscriber.onNext(userEntityJsonMapper.transformUserEntityCollection(
emitter.onNext(userEntityJsonMapper.transformUserEntityCollection(
responseUserEntities));
subscriber.onCompleted();
emitter.onComplete();
} else {
subscriber.onError(new NetworkConnectionException());
emitter.onError(new NetworkConnectionException());
}
} catch (Exception e) {
subscriber.onError(new NetworkConnectionException(e.getCause()));
emitter.onError(new NetworkConnectionException(e.getCause()));
}
} else {
subscriber.onError(new NetworkConnectionException());
emitter.onError(new NetworkConnectionException());
}
});
}
@Override public Observable<UserEntity> userEntityById(final int userId) {
return Observable.create(subscriber -> {
return Observable.create(emitter -> {
if (isThereInternetConnection()) {
try {
String responseUserDetails = getUserDetailsFromApi(userId);
if (responseUserDetails != null) {
subscriber.onNext(userEntityJsonMapper.transformUserEntity(responseUserDetails));
subscriber.onCompleted();
emitter.onNext(userEntityJsonMapper.transformUserEntity(responseUserDetails));
emitter.onComplete();
} else {
subscriber.onError(new NetworkConnectionException());
emitter.onError(new NetworkConnectionException());
}
} catch (Exception e) {
subscriber.onError(new NetworkConnectionException(e.getCause()));
emitter.onError(new NetworkConnectionException(e.getCause()));
}
} else {
subscriber.onError(new NetworkConnectionException());
emitter.onError(new NetworkConnectionException());
}
});
}

View File

@@ -20,10 +20,10 @@ import com.fernandocejas.android10.sample.data.repository.datasource.UserDataSto
import com.fernandocejas.android10.sample.data.repository.datasource.UserDataStoreFactory;
import com.fernandocejas.android10.sample.domain.User;
import com.fernandocejas.android10.sample.domain.repository.UserRepository;
import io.reactivex.Observable;
import java.util.List;
import javax.inject.Inject;
import javax.inject.Singleton;
import rx.Observable;
/**
* {@link UserRepository} for retrieving user data.

View File

@@ -18,9 +18,8 @@ package com.fernandocejas.android10.sample.data.repository.datasource;
import com.fernandocejas.android10.sample.data.cache.UserCache;
import com.fernandocejas.android10.sample.data.entity.UserEntity;
import com.fernandocejas.android10.sample.data.net.RestApi;
import io.reactivex.Observable;
import java.util.List;
import rx.Observable;
import rx.functions.Action1;
/**
* {@link UserDataStore} implementation based on connections to the api (Cloud).
@@ -30,12 +29,6 @@ class CloudUserDataStore implements UserDataStore {
private final RestApi restApi;
private final UserCache userCache;
private final Action1<UserEntity> saveToCacheAction = userEntity -> {
if (userEntity != null) {
CloudUserDataStore.this.userCache.put(userEntity);
}
};
/**
* Construct a {@link UserDataStore} based on connections to the api (Cloud).
*
@@ -52,6 +45,6 @@ class CloudUserDataStore implements UserDataStore {
}
@Override public Observable<UserEntity> userEntityDetails(final int userId) {
return this.restApi.userEntityById(userId).doOnNext(saveToCacheAction);
return this.restApi.userEntityById(userId).doOnNext(CloudUserDataStore.this.userCache::put);
}
}

View File

@@ -17,8 +17,8 @@ package com.fernandocejas.android10.sample.data.repository.datasource;
import com.fernandocejas.android10.sample.data.cache.UserCache;
import com.fernandocejas.android10.sample.data.entity.UserEntity;
import io.reactivex.Observable;
import java.util.List;
import rx.Observable;
/**
* {@link UserDataStore} implementation based on file system data store.

View File

@@ -16,20 +16,20 @@
package com.fernandocejas.android10.sample.data.repository.datasource;
import com.fernandocejas.android10.sample.data.entity.UserEntity;
import io.reactivex.Observable;
import java.util.List;
import rx.Observable;
/**
* Interface that represents a data store from where data is retrieved.
*/
public interface UserDataStore {
/**
* Get an {@link rx.Observable} which will emit a List of {@link UserEntity}.
* Get an {@link Observable} which will emit a List of {@link UserEntity}.
*/
Observable<List<UserEntity>> userEntityList();
/**
* Get an {@link rx.Observable} which will emit a {@link UserEntity} by its id.
* Get an {@link Observable} which will emit a {@link UserEntity} by its id.
*
* @param userId The id to retrieve user data.
*/

View File

@@ -20,6 +20,7 @@ import com.fernandocejas.android10.sample.data.entity.mapper.UserEntityDataMappe
import com.fernandocejas.android10.sample.data.repository.datasource.UserDataStore;
import com.fernandocejas.android10.sample.data.repository.datasource.UserDataStoreFactory;
import com.fernandocejas.android10.sample.domain.User;
import io.reactivex.Observable;
import java.util.ArrayList;
import java.util.List;
import org.junit.Before;
@@ -29,7 +30,6 @@ import org.junit.rules.ExpectedException;
import org.junit.runner.RunWith;
import org.mockito.Mock;
import org.mockito.runners.MockitoJUnitRunner;
import rx.Observable;
import static org.mockito.BDDMockito.given;
import static org.mockito.Matchers.anyInt;

View File

@@ -18,12 +18,12 @@ package com.fernandocejas.android10.sample.data.repository.datasource;
import com.fernandocejas.android10.sample.data.cache.UserCache;
import com.fernandocejas.android10.sample.data.entity.UserEntity;
import com.fernandocejas.android10.sample.data.net.RestApi;
import io.reactivex.Observable;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.Mock;
import org.mockito.runners.MockitoJUnitRunner;
import rx.Observable;
import static org.mockito.BDDMockito.given;
import static org.mockito.Mockito.verify;

View File

@@ -15,7 +15,7 @@
*/
package com.fernandocejas.android10.sample.domain.executor;
import rx.Scheduler;
import io.reactivex.Scheduler;
/**
* Thread abstraction created to change the execution context from any thread to any other thread.

View File

@@ -15,19 +15,21 @@
*/
package com.fernandocejas.android10.sample.domain.interactor;
import io.reactivex.observers.DisposableObserver;
/**
* Default subscriber base class to be used whenever you want default error handling.
* Default {@link DisposableObserver} base class to be used whenever you want default error handling.
*/
public class DefaultSubscriber<T> extends rx.Subscriber<T> {
@Override public void onCompleted() {
// no-op by default.
}
@Override public void onError(Throwable e) {
// no-op by default.
}
public class DefaultObserver<T> extends DisposableObserver<T> {
@Override public void onNext(T t) {
// no-op by default.
}
@Override public void onComplete() {
// no-op by default.
}
@Override public void onError(Throwable exception) {
// no-op by default.
}
}

View File

@@ -21,8 +21,8 @@ import com.fernandocejas.android10.sample.domain.executor.ThreadExecutor;
import com.fernandocejas.android10.sample.domain.repository.UserRepository;
import com.fernandocejas.arrow.annotations.VisibleForTesting;
import com.fernandocejas.arrow.optional.Optional;
import io.reactivex.Observable;
import javax.inject.Inject;
import rx.Observable;
/**
* This class is an implementation of {@link UseCase} that represents a use case for

View File

@@ -20,8 +20,8 @@ import com.fernandocejas.android10.sample.domain.executor.PostExecutionThread;
import com.fernandocejas.android10.sample.domain.executor.ThreadExecutor;
import com.fernandocejas.android10.sample.domain.repository.UserRepository;
import com.fernandocejas.arrow.optional.Optional;
import io.reactivex.Observable;
import javax.inject.Inject;
import rx.Observable;
/**
* This class is an implementation of {@link UseCase} that represents a use case for

View File

@@ -17,59 +17,69 @@ package com.fernandocejas.android10.sample.domain.interactor;
import com.fernandocejas.android10.sample.domain.executor.PostExecutionThread;
import com.fernandocejas.android10.sample.domain.executor.ThreadExecutor;
import com.fernandocejas.arrow.checks.Preconditions;
import com.fernandocejas.arrow.optional.Optional;
import rx.Observable;
import rx.Subscriber;
import rx.Subscription;
import rx.schedulers.Schedulers;
import rx.subscriptions.Subscriptions;
import io.reactivex.Observable;
import io.reactivex.disposables.CompositeDisposable;
import io.reactivex.disposables.Disposable;
import io.reactivex.observers.DisposableObserver;
import io.reactivex.schedulers.Schedulers;
/**
* Abstract class for a Use Case (Interactor in terms of Clean Architecture).
* This interface represents a execution unit for different use cases (this means any use case
* in the application should implement this contract).
*
* By convention each UseCase implementation will return the result using a {@link rx.Subscriber}
* By convention each UseCase implementation will return the result using a {@link DisposableObserver}
* that will execute its job in a background thread and will post the result in the UI thread.
*/
public abstract class UseCase {
private final ThreadExecutor threadExecutor;
private final PostExecutionThread postExecutionThread;
private final CompositeDisposable disposables;
private Subscription subscription = Subscriptions.empty();
protected UseCase(ThreadExecutor threadExecutor, PostExecutionThread postExecutionThread) {
UseCase(ThreadExecutor threadExecutor, PostExecutionThread postExecutionThread) {
this.threadExecutor = threadExecutor;
this.postExecutionThread = postExecutionThread;
this.disposables = new CompositeDisposable();
}
/**
* Builds an {@link rx.Observable} which will be used when executing the current {@link UseCase}.
* Builds an {@link Observable} which will be used when executing the current {@link UseCase}.
*/
protected abstract Observable buildUseCaseObservable(Optional<Params> params);
/**
* Executes the current use case.
*
* @param useCaseSubscriber Subscriber which will be listening to the observable build
* @param observer {@link DisposableObserver} which will be listening to the observable build
* by {@link #buildUseCaseObservable(Optional)} ()} method.
* @param params Parameters used to build execute this use case.
*/
@SuppressWarnings("unchecked")
public void execute(Subscriber useCaseSubscriber, Params params) {
this.subscription = this.buildUseCaseObservable(Optional.of(params))
public void execute(DisposableObserver observer, Params params) {
final Observable<?> observable = this.buildUseCaseObservable(Optional.of(params))
.subscribeOn(Schedulers.from(threadExecutor))
.observeOn(postExecutionThread.getScheduler())
.subscribe(useCaseSubscriber);
.observeOn(postExecutionThread.getScheduler());
addDisposable(observable.subscribeWith(observer));
}
/**
* Unsubscribes from current {@link rx.Subscription}.
* Dispose from current {@link CompositeDisposable}.
*/
public void unsubscribe() {
if (!subscription.isUnsubscribed()) {
subscription.unsubscribe();
public void dispose() {
if (!disposables.isDisposed()) {
disposables.dispose();
}
}
/**
* Dispose from current {@link CompositeDisposable}.
*/
private void addDisposable(Disposable disposable) {
Preconditions.checkNotNull(disposable);
Preconditions.checkNotNull(disposables);
disposables.add(disposable);
}
}

View File

@@ -16,20 +16,20 @@
package com.fernandocejas.android10.sample.domain.repository;
import com.fernandocejas.android10.sample.domain.User;
import io.reactivex.Observable;
import java.util.List;
import rx.Observable;
/**
* Interface that represents a Repository for getting {@link User} related data.
*/
public interface UserRepository {
/**
* Get an {@link rx.Observable} which will emit a List of {@link User}.
* Get an {@link Observable} which will emit a List of {@link User}.
*/
Observable<List<User>> users();
/**
* Get an {@link rx.Observable} which will emit a {@link User}.
* Get an {@link Observable} which will emit a {@link User}.
*
* @param userId The user id used to retrieve user data.
*/

View File

@@ -19,12 +19,12 @@ import com.fernandocejas.android10.sample.domain.executor.PostExecutionThread;
import com.fernandocejas.android10.sample.domain.executor.ThreadExecutor;
import com.fernandocejas.android10.sample.domain.repository.UserRepository;
import com.fernandocejas.arrow.optional.Optional;
import io.reactivex.Observable;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.Mock;
import org.mockito.runners.MockitoJUnitRunner;
import rx.Observable;
import static org.assertj.core.api.Assertions.assertThat;
import static org.mockito.Mockito.verify;

View File

@@ -18,15 +18,14 @@ package com.fernandocejas.android10.sample.domain.interactor;
import com.fernandocejas.android10.sample.domain.executor.PostExecutionThread;
import com.fernandocejas.android10.sample.domain.executor.ThreadExecutor;
import com.fernandocejas.arrow.optional.Optional;
import io.reactivex.Observable;
import io.reactivex.observers.DisposableObserver;
import io.reactivex.schedulers.TestScheduler;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.Mock;
import org.mockito.runners.MockitoJUnitRunner;
import rx.Observable;
import rx.Subscriber;
import rx.observers.TestSubscriber;
import rx.schedulers.TestScheduler;
import static org.assertj.core.api.Assertions.assertThat;
import static org.mockito.BDDMockito.given;
@@ -36,34 +35,32 @@ public class UseCaseTest {
private UseCaseTestClass useCase;
private TestDisposableObserver testObserver;
@Mock private ThreadExecutor mockThreadExecutor;
@Mock private PostExecutionThread mockPostExecutionThread;
@Before
public void setUp() {
this.useCase = new UseCaseTestClass(mockThreadExecutor, mockPostExecutionThread);
this.testObserver = new TestDisposableObserver<>();
given(mockPostExecutionThread.getScheduler()).willReturn(new TestScheduler());
}
@Test
@SuppressWarnings("unchecked")
public void testBuildUseCaseObservableReturnCorrectResult() {
TestSubscriber<Integer> testSubscriber = new TestSubscriber<>();
TestScheduler testScheduler = new TestScheduler();
given(mockPostExecutionThread.getScheduler()).willReturn(testScheduler);
useCase.execute(testObserver, Params.EMPTY);
useCase.execute(testSubscriber, Params.EMPTY);
assertThat(testSubscriber.getOnNextEvents().size()).isZero();
assertThat(testObserver.valuesCount).isZero();
}
@Test
public void testSubscriptionWhenExecutingUseCase() {
TestSubscriber<Integer> testSubscriber = new TestSubscriber<>();
useCase.execute(testObserver, Params.EMPTY);
useCase.dispose();
useCase.execute(testSubscriber, Params.EMPTY);
useCase.unsubscribe();
assertThat(testSubscriber.isUnsubscribed()).isTrue();
assertThat(testObserver.isDisposed()).isTrue();
}
private static class UseCaseTestClass extends UseCase {
@@ -76,8 +73,24 @@ public class UseCaseTest {
return Observable.empty();
}
@Override public void execute(Subscriber useCaseSubscriber, Params params) {
super.execute(useCaseSubscriber, Params.EMPTY);
@Override public void execute(DisposableObserver observer, Params params) {
super.execute(observer, Params.EMPTY);
}
}
private static class TestDisposableObserver<T> extends DisposableObserver<T> {
private int valuesCount = 0;
@Override public void onNext(T value) {
valuesCount++;
}
@Override public void onError(Throwable e) {
// no-op by default.
}
@Override public void onComplete() {
// no-op by default.
}
}
}

View File

@@ -20,12 +20,12 @@ import com.fernandocejas.android10.sample.domain.interactor.GetUserDetails;
import com.fernandocejas.android10.sample.presentation.mapper.UserModelDataMapper;
import com.fernandocejas.android10.sample.presentation.presenter.UserDetailsPresenter;
import com.fernandocejas.android10.sample.presentation.view.UserDetailsView;
import io.reactivex.observers.DisposableObserver;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.Mock;
import org.mockito.runners.MockitoJUnitRunner;
import rx.Subscriber;
import com.fernandocejas.android10.sample.domain.interactor.Params;
import static org.mockito.BDDMockito.given;
@@ -58,6 +58,6 @@ public class UserDetailsPresenterTest {
verify(mockUserDetailsView).hideRetry();
verify(mockUserDetailsView).showLoading();
verify(mockGetUserDetails).execute(any(Subscriber.class), any(Params.class));
verify(mockGetUserDetails).execute(any(DisposableObserver.class), any(Params.class));
}
}

View File

@@ -21,12 +21,12 @@ import com.fernandocejas.android10.sample.domain.interactor.Params;
import com.fernandocejas.android10.sample.presentation.mapper.UserModelDataMapper;
import com.fernandocejas.android10.sample.presentation.presenter.UserListPresenter;
import com.fernandocejas.android10.sample.presentation.view.UserListView;
import io.reactivex.observers.DisposableObserver;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.Mock;
import org.mockito.runners.MockitoJUnitRunner;
import rx.Subscriber;
import static org.mockito.BDDMockito.given;
import static org.mockito.Matchers.any;
@@ -56,6 +56,6 @@ public class UserListPresenterTest {
verify(mockUserListView).hideRetry();
verify(mockUserListView).showLoading();
verify(mockGetUserList).execute(any(Subscriber.class), any(Params.class));
verify(mockGetUserList).execute(any(DisposableObserver.class), any(Params.class));
}
}

View File

@@ -16,13 +16,13 @@
package com.fernandocejas.android10.sample.presentation;
import com.fernandocejas.android10.sample.domain.executor.PostExecutionThread;
import io.reactivex.Scheduler;
import io.reactivex.android.schedulers.AndroidSchedulers;
import javax.inject.Inject;
import javax.inject.Singleton;
import rx.Scheduler;
import rx.android.schedulers.AndroidSchedulers;
/**
* MainThread (UI Thread) implementation based on a {@link rx.Scheduler}
* MainThread (UI Thread) implementation based on a {@link Scheduler}
* which will execute actions on the Android UI thread
*/
@Singleton

View File

@@ -19,7 +19,7 @@ import android.support.annotation.NonNull;
import com.fernandocejas.android10.sample.domain.User;
import com.fernandocejas.android10.sample.domain.exception.DefaultErrorBundle;
import com.fernandocejas.android10.sample.domain.exception.ErrorBundle;
import com.fernandocejas.android10.sample.domain.interactor.DefaultSubscriber;
import com.fernandocejas.android10.sample.domain.interactor.DefaultObserver;
import com.fernandocejas.android10.sample.domain.interactor.GetUserDetails;
import com.fernandocejas.android10.sample.domain.interactor.UseCase;
import com.fernandocejas.android10.sample.domain.interactor.Params;
@@ -59,7 +59,7 @@ public class UserDetailsPresenter implements Presenter {
@Override public void pause() {}
@Override public void destroy() {
this.getUserDetailsUseCase.unsubscribe();
this.getUserDetailsUseCase.dispose();
this.viewDetailsView = null;
}
@@ -76,7 +76,7 @@ public class UserDetailsPresenter implements Presenter {
private void getUserDetails(int userId) {
final Params params = Params.create();
params.putInt(GetUserDetails.PARAM_USER_ID_KEY, userId);
this.getUserDetailsUseCase.execute(new UserDetailsSubscriber(), params);
this.getUserDetailsUseCase.execute(new UserDetailsObserver(), params);
}
private void showViewLoading() {
@@ -106,9 +106,9 @@ public class UserDetailsPresenter implements Presenter {
this.viewDetailsView.renderUser(userModel);
}
private final class UserDetailsSubscriber extends DefaultSubscriber<User> {
private final class UserDetailsObserver extends DefaultObserver<User> {
@Override public void onCompleted() {
@Override public void onComplete() {
UserDetailsPresenter.this.hideViewLoading();
}

View File

@@ -19,7 +19,7 @@ import android.support.annotation.NonNull;
import com.fernandocejas.android10.sample.domain.User;
import com.fernandocejas.android10.sample.domain.exception.DefaultErrorBundle;
import com.fernandocejas.android10.sample.domain.exception.ErrorBundle;
import com.fernandocejas.android10.sample.domain.interactor.DefaultSubscriber;
import com.fernandocejas.android10.sample.domain.interactor.DefaultObserver;
import com.fernandocejas.android10.sample.domain.interactor.GetUserList;
import com.fernandocejas.android10.sample.domain.interactor.UseCase;
import com.fernandocejas.android10.sample.domain.interactor.Params;
@@ -61,7 +61,7 @@ public class UserListPresenter implements Presenter {
@Override public void pause() {}
@Override public void destroy() {
this.getUserListUseCase.unsubscribe();
this.getUserListUseCase.dispose();
this.viewListView = null;
}
@@ -114,12 +114,12 @@ public class UserListPresenter implements Presenter {
}
private void getUserList() {
this.getUserListUseCase.execute(new UserListSubscriber(), Params.EMPTY);
this.getUserListUseCase.execute(new UserListObserver(), Params.EMPTY);
}
private final class UserListSubscriber extends DefaultSubscriber<List<User>> {
private final class UserListObserver extends DefaultObserver<List<User>> {
@Override public void onCompleted() {
@Override public void onComplete() {
UserListPresenter.this.hideViewLoading();
}