Skip to content
This repository was archived by the owner on Jan 9, 2020. It is now read-only.

Commit 44ccdb5

Browse files
jcdompedrovgs
authored andcommitted
New list in UseCaseHandler to retain error adapters in a non-weak reference (#84)
* New list in UseCaseHandler to retain error adapters in a non-weak reference * This change solves a NullPointerException in RosieUseCase.notifyError that was happening when the error adapter was cleared of memory, because the adapter was only saved in a WeakReference in RosieUseCase * Also, I am modifying OnErrorCallbackToErrorHandlerAdapter to save the constructor parameters in weak references * Small changes to follow the style rules * New error handler variable to avoid race condition
1 parent 41e3756 commit 44ccdb5

File tree

1 file changed

+24
-8
lines changed

1 file changed

+24
-8
lines changed

rosie/src/main/java/com/karumi/rosie/domain/usecase/UseCaseHandler.java

Lines changed: 24 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,10 @@
1919
import com.karumi.rosie.domain.usecase.error.ErrorHandler;
2020
import com.karumi.rosie.domain.usecase.error.OnErrorCallback;
2121

22+
import java.lang.ref.WeakReference;
23+
import java.util.ArrayList;
24+
import java.util.List;
25+
2226
/**
2327
* Invoke methods annotated with UseCase annotation. The RosieUseCase instance will be executed out
2428
* of the Android main thread and the result of the operation will be provided asynchronously using
@@ -29,6 +33,10 @@ public class UseCaseHandler {
2933
private final TaskScheduler taskScheduler;
3034
private final ErrorHandler errorHandler;
3135

36+
// This list is used to retain error adapters in a non-weak reference associated with this use
37+
// case handler
38+
private final List<OnErrorCallback> errorCallbacks = new ArrayList<>();
39+
3240
public UseCaseHandler(TaskScheduler taskScheduler, ErrorHandler errorHandler) {
3341
this.taskScheduler = taskScheduler;
3442
this.errorHandler = errorHandler;
@@ -45,8 +53,12 @@ void execute(RosieUseCase useCase, UseCaseParams useCaseParams) {
4553
UseCaseFilter.filter(useCase, useCaseParams);
4654

4755
useCase.setOnSuccessCallback(useCaseParams.getOnSuccessCallback());
48-
useCase.setOnErrorCallback(
49-
new OnErrorCallbackToErrorHandlerAdapter(errorHandler, useCaseParams.getOnErrorCallback()));
56+
57+
OnErrorCallback onErrorCallback =
58+
new OnErrorCallbackToErrorHandlerAdapter(errorHandler, useCaseParams.getOnErrorCallback());
59+
errorCallbacks.add(onErrorCallback);
60+
useCase.setOnErrorCallback(onErrorCallback);
61+
5062
UseCaseWrapper useCaseWrapper = new UseCaseWrapper(useCase, useCaseParams, errorHandler);
5163
taskScheduler.execute(useCaseWrapper);
5264
}
@@ -63,18 +75,22 @@ public void unregisterGlobalErrorCallback(OnErrorCallback globalError) {
6375
* Inner class responsible for routing the errors thrown from the use case to the error handler
6476
*/
6577
private static class OnErrorCallbackToErrorHandlerAdapter implements OnErrorCallback {
66-
private final ErrorHandler errorHandler;
67-
private final OnErrorCallback useCaseOnErrorCallback;
78+
private final WeakReference<ErrorHandler> errorHandler;
79+
private final WeakReference<OnErrorCallback> useCaseOnErrorCallback;
6880

6981
public OnErrorCallbackToErrorHandlerAdapter(ErrorHandler errorHandler,
7082
OnErrorCallback useCaseOnErrorCallback) {
71-
this.errorHandler = errorHandler;
72-
this.useCaseOnErrorCallback = useCaseOnErrorCallback;
83+
this.errorHandler = new WeakReference<>(errorHandler);
84+
this.useCaseOnErrorCallback = new WeakReference<>(useCaseOnErrorCallback);
7385
}
7486

7587
@Override public boolean onError(Error error) {
76-
errorHandler.notifyError(error, useCaseOnErrorCallback);
77-
return true;
88+
ErrorHandler errorHandler = this.errorHandler.get();
89+
if (errorHandler != null) {
90+
errorHandler.notifyError(error, useCaseOnErrorCallback.get());
91+
return true;
92+
}
93+
return false;
7894
}
7995
}
8096
}

0 commit comments

Comments
 (0)