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

Commit 49c04cb

Browse files
committed
Fixed memory leak and other small bugs.
1 parent 6f9aea5 commit 49c04cb

File tree

6 files changed

+35
-33
lines changed

6 files changed

+35
-33
lines changed

demo/build.gradle

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -27,9 +27,9 @@ dependencies {
2727
compile 'com.android.support:design:23.4.0'
2828

2929
//LeakCanary is used to detect memory leaks in debug builds.
30-
debugCompile 'com.squareup.leakcanary:leakcanary-android:1.3.1'
31-
releaseCompile 'com.squareup.leakcanary:leakcanary-android-no-op:1.3.1'
32-
testCompile 'com.squareup.leakcanary:leakcanary-android-no-op:1.3.1'
30+
debugCompile 'com.squareup.leakcanary:leakcanary-android:1.4-beta2'
31+
releaseCompile 'com.squareup.leakcanary:leakcanary-android-no-op:1.4-beta2'
32+
testCompile 'com.squareup.leakcanary:leakcanary-android-no-op:1.4-beta2'
3333

3434
//Unit-testing
3535
testCompile 'junit:junit:4.12'

library/build.gradle

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@ ext {
1616
artifact = 'android-retainable-tasks'
1717

1818
libraryDescription = 'Android-Retainable-Tasks is an easy to use mini-library for easy asynchronous background tasking with callback support to the UI. This library is based on the Android AsyncTask implementation but with support for retaining tasks and therefore surviving configuration changes (orientation).'
19-
libraryVersion = '0.2.3'
19+
libraryVersion = '0.2.4'
2020

2121
siteUrl = 'https://github.com/NeoTech-Software/Android-Retainable-Tasks'
2222
gitUrl = 'https://github.com/NeoTech-Software/Android-Retainable-Tasks.git'

library/src/main/java/org/neotech/library/retainabletasks/TaskManager.java

Lines changed: 17 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,13 @@
11
package org.neotech.library.retainabletasks;
22

33
import android.annotation.TargetApi;
4+
import android.app.Activity;
45
import android.os.Build;
56
import android.support.annotation.MainThread;
67
import android.support.annotation.NonNull;
78
import android.support.annotation.Nullable;
89
import android.support.v4.app.Fragment;
10+
import android.support.v4.app.FragmentActivity;
911
import android.support.v4.app.FragmentManager;
1012

1113
import org.neotech.library.retainabletasks.internal.BaseTaskManager;
@@ -151,11 +153,14 @@ public static boolean isStrictDebugModeEnabled(){
151153
@MainThread
152154
public static TaskManager getFragmentTaskManager(@NonNull Fragment fragment){
153155
final String tag = getTaskManagerTag(fragment.getTag());
154-
if(fragment.getParentFragment() != null){
155-
return getTaskManager(TaskRetainingFragment.getInstance(fragment.getParentFragment().getFragmentManager()), tag);
156-
} else {
157-
return getTaskManager(TaskRetainingFragment.getInstance(fragment.getFragmentManager()), tag);
156+
157+
//Get the root activity
158+
while(fragment.getParentFragment() != null){
159+
fragment = fragment.getParentFragment();
158160
}
161+
final FragmentActivity root = fragment.getActivity();
162+
163+
return getTaskManager(TaskRetainingFragment.getInstance(root.getSupportFragmentManager()), tag);
159164
}
160165

161166
/**
@@ -170,18 +175,21 @@ public static TaskManager getFragmentTaskManager(@NonNull android.app.Fragment f
170175
if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR1){
171176
return getFragmentTaskManagerAPI17(fragment, tag);
172177
} else {
173-
return getTaskManager(TaskRetainingFragment.getInstance(fragment.getFragmentManager()), tag);
178+
return getTaskManager(TaskRetainingFragment.getInstance(fragment.getActivity().getFragmentManager()), tag);
174179
}
175180
}
176181

177182
@TargetApi(Build.VERSION_CODES.JELLY_BEAN_MR1)
178183
@MainThread
179184
private static TaskManager getFragmentTaskManagerAPI17(@NonNull android.app.Fragment fragment, String tag){
180-
if(fragment.getParentFragment() != null){
181-
return getTaskManager(TaskRetainingFragment.getInstance(fragment.getParentFragment().getFragmentManager()), tag);
182-
} else {
183-
return getTaskManager(TaskRetainingFragment.getInstance(fragment.getFragmentManager()), tag);
185+
186+
//Get the root activity
187+
while(fragment.getParentFragment() != null){
188+
fragment = fragment.getParentFragment();
184189
}
190+
final Activity root = fragment.getActivity();
191+
192+
return getTaskManager(TaskRetainingFragment.getInstance(root.getFragmentManager()), tag);
185193
}
186194

187195

library/src/main/java/org/neotech/library/retainabletasks/TaskManagerLifeCycleProxy.java

Lines changed: 9 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
import android.annotation.TargetApi;
44
import android.app.Activity;
55
import android.os.Build;
6+
import android.support.annotation.MainThread;
67
import android.support.annotation.NonNull;
78
import android.support.v4.app.Fragment;
89
import android.support.v4.app.FragmentActivity;
@@ -12,7 +13,7 @@
1213
/**
1314
* Created by Rolf on 3-3-2016.
1415
*/
15-
public final class TaskManagerLifeCycleProxy implements BaseTaskManager.UIStateProvider {
16+
public final class TaskManagerLifeCycleProxy {
1617

1718
private BaseTaskManager fragmentTaskManager;
1819
private final TaskManagerProvider provider;
@@ -32,23 +33,28 @@ public TaskManagerLifeCycleProxy(@NonNull TaskManagerProvider provider){
3233
this.provider = provider;
3334
}
3435

36+
@MainThread
3537
public void onStart(){
3638
uiReady = true;
39+
((BaseTaskManager) getTaskManager()).setUIReady(uiReady);
3740
((BaseTaskManager) getTaskManager()).attach(provider);
3841
}
3942

43+
@MainThread
4044
public void onStop(){
4145
uiReady = false;
46+
((BaseTaskManager) getTaskManager()).setUIReady(uiReady);
4247
((BaseTaskManager) getTaskManager()).detach();
4348
}
4449

50+
@MainThread
4551
@TargetApi(Build.VERSION_CODES.HONEYCOMB)
4652
public TaskManager getTaskManager(){
4753
if(fragmentTaskManager != null) {
4854
return fragmentTaskManager;
4955
}
5056
if(provider instanceof FragmentActivity){
51-
fragmentTaskManager = (BaseTaskManager) TaskManager.getActivityTaskManager(((FragmentActivity) provider).getSupportFragmentManager());
57+
fragmentTaskManager = (BaseTaskManager) TaskManager.getActivityTaskManager(((FragmentActivity) provider).getFragmentManager());
5258
} else if(provider instanceof Fragment){
5359
fragmentTaskManager = (BaseTaskManager) TaskManager.getFragmentTaskManager((Fragment) provider);
5460
} else if(provider instanceof Activity){
@@ -59,12 +65,7 @@ public TaskManager getTaskManager(){
5965
//This should never happen as the constructor checks everything.
6066
}
6167
*/
62-
fragmentTaskManager.setUIStateProvider(this);
68+
fragmentTaskManager.setUIReady(uiReady);
6369
return fragmentTaskManager;
6470
}
65-
66-
@Override
67-
public boolean isUserInterfaceReady() {
68-
return uiReady;
69-
}
7071
}

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

Lines changed: 5 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,8 @@ public final class BaseTaskManager extends TaskManager {
2424
private static final String TAG = "BaseTaskManager";
2525

2626
protected final HashMap<String, Task<?, ?>> tasks = new HashMap<>();
27-
protected UIStateProvider uiStateProvider = null;
27+
28+
protected boolean isUIReady = true;
2829

2930
@Override
3031
public Task<?, ?> getTask(@NonNull String tag) {
@@ -138,7 +139,7 @@ public <Progress, Result> void execute(@NonNull Task<Progress, Result> task, @No
138139
throw new IllegalStateException("Task with an equal tag: '" + task.getTag() + "' has already been added and is currently running or finishing.");
139140
}
140141
tasks.put(task.getTag(), task);
141-
if(uiStateProvider == null || uiStateProvider.isUserInterfaceReady() ){
142+
if(isUIReady){
142143
task.setCallback(new CallbackShadow(callback));
143144
} else {
144145
task.removeCallback();
@@ -230,12 +231,8 @@ private void removeFinishedTask(Task expectedTask){
230231
tasks.remove(expectedTask.getTag());
231232
}
232233

233-
public void setUIStateProvider(UIStateProvider uiStateProvider){
234-
this.uiStateProvider = uiStateProvider;
235-
}
236-
237-
public interface UIStateProvider {
238-
boolean isUserInterfaceReady();
234+
public void setUIReady(boolean isReady){
235+
this.isUIReady = isReady;
239236
}
240237

241238
private final class CallbackShadow implements Task.AdvancedCallback {

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

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -26,8 +26,6 @@ public static TaskRetainingFragment getInstance(FragmentManager fragmentManager)
2626
TaskRetainingFragmentCompat taskFragment = (TaskRetainingFragmentCompat) fragmentManager.findFragmentByTag(FRAGMENT_TAG);
2727
if(taskFragment == null){
2828
taskFragment = new TaskRetainingFragmentCompat();
29-
}
30-
if(!taskFragment.isAdded()) {
3129
fragmentManager.beginTransaction().add(taskFragment, FRAGMENT_TAG).commit();
3230
}
3331
return taskFragment.logic;
@@ -38,8 +36,6 @@ public static TaskRetainingFragment getInstance(android.app.FragmentManager frag
3836
TaskRetainingFragmentV11 taskFragment = (TaskRetainingFragmentV11) fragmentManager.findFragmentByTag(FRAGMENT_TAG);
3937
if(taskFragment == null){
4038
taskFragment = new TaskRetainingFragmentV11();
41-
}
42-
if(!taskFragment.isAdded()) {
4339
fragmentManager.beginTransaction().add(taskFragment, FRAGMENT_TAG).commit();
4440
}
4541
return taskFragment.logic;

0 commit comments

Comments
 (0)