项目中对于一些并不复杂的耗时操作,比如计算,不频繁操作数据库等,因为没必要使用线程池,所以之前项目会直接使用new Thread的方式,时间一长,回头再看,原来new Thread之处已经很多了,这样带来了一些问题:
问题抛出了,就想办法解决吧。对于任务量小,操作不那么频繁的,我们只需要放在一个后台线程中即能满足要求,思路是只需要分门别类就可以了,对于操作数据库的,都使用data线程,对于计算相关的,都使用background线程,这样整个项目只需要维护几个固定后台线程。
自己封装了ThreadManager。
public class ThreadManager { /** 主线程 */ public static final int THREAD_UI = 0; /** background线程,用于一般的耗时操作 */ public static final int THREAD_BACKGROUND = 1; /** data线程,用于数据库操作 */ public static final int THREAD_DATA = 2; private static final int THREAD_SIZE = 3; /** 线程信息数组 */ private static final Handler[] HANDLER_LIST = new Handler[THREAD_SIZE]; private static final String[] THREAD_NAME_LIST = { "thread_ui", "thread_background", "thread_data" }; private ThreadManager() { HANDLER_LIST[THREAD_UI] = new Handler(); } private static class ThreadManagerHolder { private static ThreadManager sManager = new ThreadManager(); } public static ThreadManager getManager() { return ThreadManagerHolder.sManager; } /** * 派发任务 * * @param index 线程类型 */ public void post(int index, Runnable r) { postDelayed(index, r, 0); } /** * 延迟派发任务 * * @param index 线程类型 */ public void postDelayed(int index, Runnable r, long delayMillis) { Handler handler = getHandler(index); handler.postDelayed(r, delayMillis); } /** * 删除任务 * * @param index 线程类型 */ public void removeCallbacks(int index, Runnable r) { Handler handler = getHandler(index); handler.removeCallbacks(r); } /** * 获取线程Handler * * @param index 线程类型 */ public Handler getHandler(int index) { if (index < 0 || index >= THREAD_SIZE) { throw new InvalidParameterException(); } if (HANDLER_LIST[index] == null) { synchronized (HANDLER_LIST) { if (HANDLER_LIST[index] == null) { HandlerThread thread = new HandlerThread(THREAD_NAME_LIST[index]); if (index != THREAD_UI) { //优先级要低于主线程 thread.setPriority(Thread.MIN_PRIORITY); } thread.start(); Handler handler = new Handler(thread.getLooper()); HANDLER_LIST[index] = handler; } } } return HANDLER_LIST[index]; } /** * 判断是否运行在当前线程 * * @param index 线程类型 * @return true yes */ public boolean runningOnCurrent(int index) { return getHandler(index).getLooper() == Looper.myLooper(); }}注释一目了然,不做解释。
项目中对于一些并不复杂的耗时操作,比如计算,不频繁操作数据库等,因为没必要使用线程池,所以之前项目会直接使用new Thread的方式,时间一长,回头再看,原来new Thread之处已经很多了,这样带来了一些问题:
问题抛出了,就想办法解决吧。对于任务量小,操作不那么频繁的,我们只需要放在一个后台线程中即能满足要求,思路是只需要分门别类就可以了,对于操作数据库的,都使用data线程,对于计算相关的,都使用background线程,这样整个项目只需要维护几个固定后台线程。
自己封装了ThreadManager。
public class ThreadManager { /** 主线程 */ public static final int THREAD_UI = 0; /** background线程,用于一般的耗时操作 */ public static final int THREAD_BACKGROUND = 1; /** data线程,用于数据库操作 */ public static final int THREAD_DATA = 2; private static final int THREAD_SIZE = 3; /** 线程信息数组 */ private static final Handler[] HANDLER_LIST = new Handler[THREAD_SIZE]; private static final String[] THREAD_NAME_LIST = { "thread_ui", "thread_background", "thread_data" }; private ThreadManager() { HANDLER_LIST[THREAD_UI] = new Handler(); } private static class ThreadManagerHolder { private static ThreadManager sManager = new ThreadManager(); } public static ThreadManager getManager() { return ThreadManagerHolder.sManager; } /** * 派发任务 * * @param index 线程类型 */ public void post(int index, Runnable r) { postDelayed(index, r, 0); } /** * 延迟派发任务 * * @param index 线程类型 */ public void postDelayed(int index, Runnable r, long delayMillis) { Handler handler = getHandler(index); handler.postDelayed(r, delayMillis); } /** * 删除任务 * * @param index 线程类型 */ public void removeCallbacks(int index, Runnable r) { Handler handler = getHandler(index); handler.removeCallbacks(r); } /** * 获取线程Handler * * @param index 线程类型 */ public Handler getHandler(int index) { if (index < 0 || index >= THREAD_SIZE) { throw new InvalidParameterException(); } if (HANDLER_LIST[index] == null) { synchronized (HANDLER_LIST) { if (HANDLER_LIST[index] == null) { HandlerThread thread = new HandlerThread(THREAD_NAME_LIST[index]); if (index != THREAD_UI) { //优先级要低于主线程 thread.setPriority(Thread.MIN_PRIORITY); } thread.start(); Handler handler = new Handler(thread.getLooper()); HANDLER_LIST[index] = handler; } } } return HANDLER_LIST[index]; } /** * 判断是否运行在当前线程 * * @param index 线程类型 * @return true yes */ public boolean runningOnCurrent(int index) { return getHandler(index).getLooper() == Looper.myLooper(); }}注释一目了然,不做解释。

在绑定生命周期的api中使用,需要主动removeCallBacks,防止内存泄漏。
以上就是关于项目中一些固定线程的封装。
水平有限,如有不对之处,欢迎指出。

在绑定生命周期的api中使用,需要主动removeCallBacks,防止内存泄漏。
以上就是关于项目中一些固定线程的封装。
水平有限,如有不对之处,欢迎指出。
Android中关于项目中对Thread的管理(不是线程池)
原文:http://www.cnblogs.com/gisoracle/p/7623327.html