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

Commit a6b5d5a

Browse files
committed
Strict-mode bug fix.
1 parent 4a5de01 commit a6b5d5a

File tree

4 files changed

+54
-5
lines changed

4 files changed

+54
-5
lines changed

library/src/main/java/org/neotech/library/retainabletasks/internal/BaseTaskManager.java

Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
package org.neotech.library.retainabletasks.internal;
22

3+
import android.os.Looper;
34
import android.support.annotation.MainThread;
45
import android.support.annotation.NonNull;
56
import android.util.Log;
@@ -30,6 +31,9 @@ public final class BaseTaskManager extends TaskManager {
3031
}
3132

3233
public void attach(TaskManagerProvider taskManagerProvider){
34+
if(TaskManager.isStrictDebugModeEnabled()){
35+
assertMainThread();
36+
}
3337
/*
3438
* If this loop would directly set new Callback listeners it could cause a task to deliver
3539
* its result. Meaning that the removeFinishedTask method can be called causing the 'tasks'
@@ -77,6 +81,9 @@ public void attach(TaskManagerProvider taskManagerProvider){
7781

7882
@Override
7983
public Task<?, ?> attach(@NonNull Task<?, ?> task, @NonNull Task.Callback callback) {
84+
if(TaskManager.isStrictDebugModeEnabled()){
85+
assertMainThread();
86+
}
8087
task.setCallback(new CallbackShadow(callback));
8188
return task;
8289
}
@@ -97,6 +104,9 @@ public void attachAll(@NonNull TaskAttachListener attachListener, @NonNull Strin
97104

98105
@Override
99106
public Task<?, ?> detach(@NonNull String tag) {
107+
if(TaskManager.isStrictDebugModeEnabled()){
108+
assertMainThread();
109+
}
100110
final Task<?, ?> task = tasks.get(tag);
101111
if(task != null){
102112
task.removeCallback();
@@ -119,6 +129,9 @@ public <Progress, Result> void execute(@NonNull Task<Progress, Result> task, @No
119129

120130
@Override
121131
public <Progress, Result> void execute(@NonNull Task<Progress, Result> task, @NonNull Task.Callback callback, @NonNull Executor executor) {
132+
if(TaskManager.isStrictDebugModeEnabled()){
133+
assertMainThread();
134+
}
122135
final Task currentTask = tasks.get(task.getTag());
123136
if(currentTask != null && currentTask.isRunning()){
124137
throw new IllegalStateException("Task with an equal tag: '" + task.getTag() + "' has already been added and is currently running or finishing.");
@@ -131,27 +144,43 @@ public <Progress, Result> void execute(@NonNull Task<Progress, Result> task, @No
131144
@Override
132145
@MainThread
133146
public boolean isResultDelivered(@NonNull String tag) {
147+
if(TaskManager.isStrictDebugModeEnabled()){
148+
assertMainThread();
149+
}
134150
Task task = tasks.get(tag);
135151
return task != null && task.isResultDelivered();
136152
}
137153

138154
@Override
139155
@MainThread
140156
public boolean isRunning(@NonNull String tag) {
157+
if(TaskManager.isStrictDebugModeEnabled()){
158+
assertMainThread();
159+
}
141160
Task task = tasks.get(tag);
142161
return task != null && task.isRunning();
143162
}
144163

145164
@Override
146165
@MainThread
147166
public Task<?, ?> cancel(@NonNull String tag){
167+
if(TaskManager.isStrictDebugModeEnabled()){
168+
assertMainThread();
169+
}
148170
final Task<?, ?> task = tasks.remove(tag);
149171
if(task != null){
150172
task.cancel(false);
151173
}
152174
return task;
153175
}
154176

177+
178+
public void assertMainThread() throws IllegalStateException {
179+
if(Looper.getMainLooper() != Looper.myLooper()){
180+
throw new IllegalStateException("Method not called on the UI-thread!");
181+
}
182+
}
183+
155184
@Override
156185
@MainThread
157186
public void assertAllTasksDetached() throws IllegalStateException {
@@ -165,13 +194,24 @@ public void assertAllTasksDetached() throws IllegalStateException {
165194

166195
@MainThread
167196
public void cancelAll(){
197+
if(TaskManager.isStrictDebugModeEnabled()){
198+
assertMainThread();
199+
}
168200
for(Map.Entry<String, Task<?, ?>> task: tasks.entrySet()){
169201
task.getValue().cancel(true);
170202
}
171203
}
172204

173205
@MainThread
174206
public void detach(){
207+
if(TaskManager.isStrictDebugModeEnabled()){
208+
assertMainThread();
209+
}
210+
/**
211+
* The problem described in the attach(TaskManagerProvider) doesn't apply to this method
212+
* as all TaskManager methods should be executed on the UI-thread, meaning that no other
213+
* method can be called while inside this method.
214+
*/
175215
for(Map.Entry<String, Task<?, ?>> task: tasks.entrySet()){
176216
task.getValue().removeCallback();
177217
}

library/src/main/java/org/neotech/library/retainabletasks/internal/TaskRetainingFragment.java

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -64,7 +64,7 @@ public BaseTaskManager getActivityTaskManager(){
6464
return taskManager;
6565
}
6666

67-
public void assertAllRemoved(){
67+
public void assertFragmentTasksAreDetached(){
6868
if(!TaskManager.isStrictDebugModeEnabled()){
6969
return;
7070
}
@@ -76,4 +76,11 @@ public void assertAllRemoved(){
7676
}
7777
}
7878
}
79+
80+
public void assertActivityTasksAreDetached(){
81+
if(!TaskManager.isStrictDebugModeEnabled()){
82+
return;
83+
}
84+
taskManager.assertAllTasksDetached();
85+
}
7986
}

library/src/main/java/org/neotech/library/retainabletasks/internal/TaskRetainingFragmentCompat.java

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@ public void onStop() {
2121
super.onStop();
2222
//As soon as the activity is stopped the UI should not be touched.
2323
logic.getActivityTaskManager().detach();
24-
logic.assertAllRemoved();
24+
logic.assertActivityTasksAreDetached();
2525
}
2626

2727
@Override
@@ -34,7 +34,8 @@ public void onDestroy() {
3434
* The references to the tasks are lost at this point.
3535
*/
3636

37-
logic.getActivityTaskManager().detach();
37+
//logic.getActivityTaskManager().detach();
38+
logic.assertFragmentTasksAreDetached();
3839
super.onDestroy();
3940
}
4041
}

library/src/main/java/org/neotech/library/retainabletasks/internal/TaskRetainingFragmentV11.java

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,7 @@ public void onStop() {
2424
super.onStop();
2525
//As soon as the activity is stopped the UI should not be touched.
2626
logic.getActivityTaskManager().detach();
27-
logic.assertAllRemoved();
27+
logic.assertActivityTasksAreDetached();
2828
}
2929

3030
@Override
@@ -37,7 +37,8 @@ public void onDestroy() {
3737
* The references to the tasks are lost at this point.
3838
*/
3939

40-
logic.getActivityTaskManager().detach();
40+
//logic.getActivityTaskManager().detach();
41+
logic.assertFragmentTasksAreDetached();
4142
super.onDestroy();
4243
}
4344
}

0 commit comments

Comments
 (0)