mirror of
				https://github.com/pierre42100/ComunicAndroid
				synced 2025-10-31 09:34:47 +00:00 
			
		
		
		
	Create SafeAsyncTasks manager
This commit is contained in:
		| @@ -50,6 +50,13 @@ public abstract class SafeAsyncTask<Params, Progress, Result> | ||||
|         this.onPostExecuteListener = onPostExecuteListener; | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * Remove current onPostExecuteListener | ||||
|      */ | ||||
|     public void removeOnPostExecuteListener(){ | ||||
|         this.onPostExecuteListener = null; | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * Check whether the a OnPostExecuteListener has been set or not | ||||
|      * | ||||
|   | ||||
| @@ -0,0 +1,108 @@ | ||||
| package org.communiquons.android.comunic.client.ui.asynctasks; | ||||
|  | ||||
| import android.support.annotation.NonNull; | ||||
| import android.support.annotation.Nullable; | ||||
|  | ||||
| import java.util.ArrayList; | ||||
|  | ||||
| /** | ||||
|  * SafeAsyncTask manager | ||||
|  * | ||||
|  * Allows an easy management of AsyncTasks | ||||
|  * | ||||
|  * @author Pierre HUBERT | ||||
|  */ | ||||
| public class SafeAsyncTasksManager { | ||||
|  | ||||
|     /** | ||||
|      * The list of tasks | ||||
|      */ | ||||
|     private ArrayList<SafeAsyncTask> mTasks = new ArrayList<>(); | ||||
|  | ||||
|  | ||||
|     /** | ||||
|      * Add a task to the manager | ||||
|      * | ||||
|      * @param task The task to add | ||||
|      */ | ||||
|     public void addTask(@NonNull SafeAsyncTask task){ | ||||
|         addTask(task, false); | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * Add a task to the manager | ||||
|      * | ||||
|      * @param task The task to add | ||||
|      * @param unsetSimilar Set to true to remove any similar class | ||||
|      */ | ||||
|     public void addTask(@NonNull SafeAsyncTask task, boolean unsetSimilar){ | ||||
|  | ||||
|         if(unsetSimilar) | ||||
|             unsetSpecificTasks(task.getClass()); | ||||
|  | ||||
|         mTasks.add(task); | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * Get the first task that belongs to a specific class | ||||
|      * | ||||
|      * @param cls The kind of class to search for | ||||
|      * @return The first task, or null if none found | ||||
|      */ | ||||
|     @Nullable | ||||
|     public SafeAsyncTask getTask(Class<?> cls){ | ||||
|         for(SafeAsyncTask task : mTasks){ | ||||
|             if(task.getClass().equals(cls)) | ||||
|                 return task; | ||||
|         } | ||||
|  | ||||
|         return null; | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * Remove a task from the manager | ||||
|      * | ||||
|      * @param task The task to removes | ||||
|      */ | ||||
|     public void removeTask(SafeAsyncTask task){ | ||||
|         mTasks.remove(task); | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * Unset a task | ||||
|      * | ||||
|      * @param task The task to unset | ||||
|      */ | ||||
|     public void unsetTask(@Nullable SafeAsyncTask task){ | ||||
|         if(task != null) { | ||||
|             task.removeOnPostExecuteListener(); | ||||
|             removeTask(task); | ||||
|         } | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * Unset all running tasks | ||||
|      */ | ||||
|     public synchronized void unsetAllTasks(){ | ||||
|         for(SafeAsyncTask task : mTasks){ | ||||
|             if(task != null) | ||||
|                 task.removeOnPostExecuteListener(); | ||||
|  | ||||
|         } | ||||
|  | ||||
|         mTasks = new ArrayList<>(); | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * Unset only a specific kind of class | ||||
|      * | ||||
|      * @param cls The tasks to disable | ||||
|      */ | ||||
|     public void unsetSpecificTasks(Class<?> cls){ | ||||
|         for (SafeAsyncTask task : mTasks){ | ||||
|             if(task.getClass().equals(cls)) | ||||
|                 unsetTask(task); | ||||
|  | ||||
|         } | ||||
|     } | ||||
| } | ||||
| @@ -0,0 +1,45 @@ | ||||
| package org.communiquons.android.comunic.client.ui.fragments; | ||||
|  | ||||
| import android.os.Bundle; | ||||
| import android.support.annotation.Nullable; | ||||
| import android.support.v4.app.Fragment; | ||||
|  | ||||
| import org.communiquons.android.comunic.client.ui.asynctasks.SafeAsyncTasksManager; | ||||
|  | ||||
| /** | ||||
|  * Base fragment for the fragments of the application | ||||
|  * | ||||
|  * Integrates task manager | ||||
|  * | ||||
|  * @author Pierre HUBERT | ||||
|  */ | ||||
| public abstract class AbstractFragment extends Fragment { | ||||
|  | ||||
|     /** | ||||
|      * Tasks manager | ||||
|      */ | ||||
|     private SafeAsyncTasksManager mTasksManager; | ||||
|  | ||||
|     @Override | ||||
|     public void onCreate(@Nullable Bundle savedInstanceState) { | ||||
|         super.onCreate(savedInstanceState); | ||||
|  | ||||
|         mTasksManager = new SafeAsyncTasksManager(); | ||||
|     } | ||||
|  | ||||
|     @Override | ||||
|     public void onDestroy() { | ||||
|         super.onDestroy(); | ||||
|  | ||||
|         getTasksManager().unsetAllTasks(); | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * Get the task manager associated with the fragment | ||||
|      * | ||||
|      * @return The task manager | ||||
|      */ | ||||
|     SafeAsyncTasksManager getTasksManager() { | ||||
|         return mTasksManager; | ||||
|     } | ||||
| } | ||||
| @@ -7,7 +7,6 @@ import android.os.Bundle; | ||||
| import android.support.annotation.CallSuper; | ||||
| import android.support.annotation.NonNull; | ||||
| import android.support.annotation.Nullable; | ||||
| import android.support.v4.app.Fragment; | ||||
| import android.support.v4.app.FragmentTransaction; | ||||
| import android.support.v7.widget.DividerItemDecoration; | ||||
| import android.support.v7.widget.LinearLayoutManager; | ||||
| @@ -56,7 +55,7 @@ import java.util.Objects; | ||||
|  * Created by pierre on 3/18/18. | ||||
|  */ | ||||
|  | ||||
| public abstract class AbstractPostsListFragment extends Fragment | ||||
| public abstract class AbstractPostsListFragment extends AbstractFragment | ||||
|     implements onPostUpdateListener, OnScrollChangeDetectListener, PostsCreateFormFragment.OnPostCreated { | ||||
|  | ||||
|     /** | ||||
|   | ||||
| @@ -24,11 +24,6 @@ public class LatestPostsFragment extends AbstractPostsListFragment { | ||||
|      */ | ||||
|     private static final String TAG = "LatestPostsFragment"; | ||||
|  | ||||
|     /** | ||||
|      * Load posts task | ||||
|      */ | ||||
|     private GetLatestPostsTask mGetLatestPostsTask; | ||||
|  | ||||
|     @Override | ||||
|     public void onResume() { | ||||
|         super.onResume(); | ||||
| @@ -41,16 +36,7 @@ public class LatestPostsFragment extends AbstractPostsListFragment { | ||||
|     @Override | ||||
|     public void onStop() { | ||||
|         super.onStop(); | ||||
|         unset_all_load_tasks(); | ||||
|     } | ||||
|  | ||||
|  | ||||
|     /** | ||||
|      * Unset all pending load tasks | ||||
|      */ | ||||
|     private void unset_all_load_tasks(){ | ||||
|         if(mGetLatestPostsTask != null) | ||||
|             mGetLatestPostsTask.setOnPostExecuteListener(null); | ||||
|         getTasksManager().unsetAllTasks(); | ||||
|     } | ||||
|  | ||||
|     /** | ||||
| @@ -60,25 +46,28 @@ public class LatestPostsFragment extends AbstractPostsListFragment { | ||||
|      */ | ||||
|     private boolean is_loading_posts() { | ||||
|  | ||||
|         return mGetLatestPostsTask != null && | ||||
|                 mGetLatestPostsTask.hasOnPostExecuteListener() && | ||||
|                 !mGetLatestPostsTask.isCancelled() && | ||||
|                 mGetLatestPostsTask.getStatus() != AsyncTask.Status.FINISHED; | ||||
|         SafeAsyncTask task = getTasksManager().getTask(GetLatestPostsTask.class); | ||||
|  | ||||
|         return task != null && | ||||
|                 task.hasOnPostExecuteListener() && | ||||
|                 !task.isCancelled() && | ||||
|                 task.getStatus() != AsyncTask.Status.FINISHED; | ||||
|  | ||||
|     } | ||||
|  | ||||
|     @Override | ||||
|     public void onLoadPosts() { | ||||
|         //Get the list of latest posts | ||||
|         unset_all_load_tasks(); | ||||
|         mGetLatestPostsTask = new GetLatestPostsTask(getActivity()); | ||||
|         mGetLatestPostsTask.setOnPostExecuteListener(new SafeAsyncTask.OnPostExecuteListener<PostsList>() { | ||||
|         getTasksManager().unsetSpecificTasks(GetLatestPostsTask.class); | ||||
|         GetLatestPostsTask getLatestPostsTask = new GetLatestPostsTask(getActivity()); | ||||
|         getLatestPostsTask.setOnPostExecuteListener(new SafeAsyncTask.OnPostExecuteListener<PostsList>() { | ||||
|             @Override | ||||
|             public void OnPostExecute(PostsList posts) { | ||||
|                 onGotNewPosts(posts); | ||||
|             } | ||||
|         }); | ||||
|         mGetLatestPostsTask.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR); | ||||
|         getLatestPostsTask.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR); | ||||
|         getTasksManager().addTask(getLatestPostsTask, true); | ||||
|     } | ||||
|  | ||||
|     @Override | ||||
| @@ -100,14 +89,15 @@ public class LatestPostsFragment extends AbstractPostsListFragment { | ||||
|         int start = last_post_id - 1; | ||||
|  | ||||
|         //Get older posts | ||||
|         mGetLatestPostsTask = new GetLatestPostsTask(getActivity()); | ||||
|         mGetLatestPostsTask.setOnPostExecuteListener(new SafeAsyncTask.OnPostExecuteListener<PostsList>() { | ||||
|         GetLatestPostsTask getLastestPostsTask = new GetLatestPostsTask(getActivity()); | ||||
|         getLastestPostsTask.setOnPostExecuteListener(new SafeAsyncTask.OnPostExecuteListener<PostsList>() { | ||||
|             @Override | ||||
|             public void OnPostExecute(PostsList posts) { | ||||
|                 onGotNewPosts(posts); | ||||
|             } | ||||
|         }); | ||||
|         mGetLatestPostsTask.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR, start); | ||||
|         getLastestPostsTask.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR, start); | ||||
|         getTasksManager().addTask(getLastestPostsTask, true); | ||||
|     } | ||||
|  | ||||
|     @Override | ||||
|   | ||||
		Reference in New Issue
	
	Block a user
	 Pierre HUBERT
					Pierre HUBERT