最近的項目中有用到很多在線程中請求服務(wù)器的耗時操作,但是沒有大量的高并發(fā)操作,因此不打算使用線程池,但是
每次都做請求服務(wù)器的耗時操作時,都會new Thread,這樣做可能會損耗性能,也可能會產(chǎn)生其他原因。因此打算使用封裝一個線程管理的類,統(tǒng)一管理線程,方便維護(hù)。
public class ThreadManager {
/** 主線程 */
public static final int THREAD_UI = 0;
/** background線程,用于一般的耗時操作 */
public static final int THREAD_BACKGROUND = 1;
/** data線程,用于數(shù)據(jù)庫操作 */
public static final int THREAD_DATA = 2;
private static final int THREAD_SIZE = 3;
/** 線程信息數(shù)組 */
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;
}
/**
* 派發(fā)任務(wù)
*
* @param index 線程類型
*/
public void post(int index, Runnable r) {
postDelayed(index, r, 0);
}
/**
* 延遲派發(fā)任務(wù)
*
* @param index 線程類型
*/
public void postDelayed(int index, Runnable r, long delayMillis) {
Handler handler = getHandler(index);
handler.postDelayed(r, delayMillis);
}
/**
* 刪除任務(wù)
*
* @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) {
//優(yōu)先級要低于主線程
thread.setPriority(Thread.MIN_PRIORITY);
}
thread.start();
Handler handler = new Handler(thread.getLooper());
HANDLER_LIST[index] = handler;
}
}
}
return HANDLER_LIST[index];
}
/**
* 判斷是否運(yùn)行在當(dāng)前線程
*
* @param index 線程類型
* @return true yes
*/
public boolean runningOnCurrent(int index) {
return getHandler(index).getLooper() == Looper.myLooper();
}
}
使用方法
ThreadManager.getManager.post(ThreadManager.THREAD_BACKGROUND,new Runable(){
@override
public void run(){
//TODO
}
});
原文鏈接:http://www.jcodecraeer.com/a/anzhuokaifa/androidkaifa/2017/0703/8147.html