Android中創(chuàng)建多線程管理器實例
如果你要反復執(zhí)行一個任務,用不同的數(shù)據(jù)集(參數(shù)不同),但一次只要一個執(zhí)行(任務是單線程的),IntentService符合你的需求。當需要在資源可用時自動執(zhí)行任務,或允許多任務同時執(zhí)行,你需要一個線程管理器管理你的線程。ThreadPoolExecutor,會維護一個隊列,當它的線程池有空時,從隊列里取任務,并執(zhí)行。要運行任務,你要做的就是把它加到隊列里。
線程池可以并聯(lián)運行一個任務的多個實例,所以你要保存代碼線程安全。能被多線程訪問的變量需要同步塊.更多信息,見Processes and Threads(http://developer.android.com/guide/components/processes-and-threads.html)
定義線程池類
在它自己類中實例ThreadPoolExecutor.在類里,如下操作:
為線程池使用static變量
你可能在app里只需要一個單例的線程池,這是為了統(tǒng)一控制限制CPU或網(wǎng)絡資源。如果你有不同的Runnable類型,你可能想要每種類型都有各自的線程池,但這些都可以放到一個單一的實例里。比如,你可以把它聲明成全局變量:
public class PhotoManager {
...
static {
...
// Creates a single static instance of PhotoManager
sInstance = new PhotoManager();
}
...
使用private構造方法
把構造方法聲明成private,可以確保單例,這意味著你不需要在同步代碼塊里封裝類訪問。
public class PhotoManager {
...
/**
* 構建用來下載和decode圖片的工作隊列和線程池,因為構造方法標記為private,
* 對其他類不可訪問(甚至同包下的類)
*/
private PhotoManager() {
...
}
調用線程池類里的方法來開始任務
線程池類里定義一個方法,用來添加任務到線程池隊列,如:
public class PhotoManager {
...
// 供PhotoView調用獲取圖片
static public PhotoTask startDownload(
PhotoView imageView,
boolean cacheFlag) {
...
// 添加一個任務到線程池
sInstance.
mDownloadThreadPool.
execute(downloadTask.getHTTPDownloadRunnable());
...
}
實例化一個UI線程的Handler.
Handler用于與UI線程通訊,大多數(shù)UI控件只允許在UI線程修改。
private PhotoManager() {
...
// Defines a Handler object that's attached to the UI thread
mHandler = new Handler(Looper.getMainLooper()) {
/*
* handleMessage() defines the operations to perform when
* the Handler receives a new Message to process.
*/
@Override
public void handleMessage(Message inputMessage) {
...
}
...
}
}
判斷線程池參數(shù)
一旦你有了全部類結構,你就可以開始定義線程池。實例化一個線程池對象,你需要下面的值:
初始池大小,最大池大小。
線程池的線程數(shù)量主要依賴于設備的CPU核心數(shù).可以從系統(tǒng)環(huán)境中獲取。
public class PhotoManager {
...
/*
* Gets the number of available cores
* (not always the same as the maximum number of cores)
*/
private static int NUMBER_OF_CORES =
Runtime.getRuntime().availableProcessors();
}
這個數(shù)字可能不能反映出設備的物理cpu內核數(shù)量;某些設備CPU會根據(jù)系統(tǒng)負載自動禁用部分內核,對于這些設備,availableProcessors()返回的是當前活躍的內核數(shù)量。
保持活躍時間和時間單位
一個進程在關閉前,保持空閑狀態(tài)的時間(可以復用進程)。時間單位在TimeUnit里
任務隊列
ThreadPoolExecutor的列隊保存Runnable對象。在線程中執(zhí)行代碼,線程池管理器會從一個FIFO隊列里取出一個Runnable對象,附加到線程里。隊列實現(xiàn)BlockingQueue接口,在創(chuàng)建線程池時提供。你可以從現(xiàn)有實現(xiàn)中選一個,適應你的需求,參見ThreadPoolExecutor。下面是使用LinkedBlockingQueue的例子:
public class PhotoManager {
...
private PhotoManager() {
...
// A queue of Runnables
private final BlockingQueue<Runnable> mDecodeWorkQueue;
...
// Instantiates the queue of Runnables as a LinkedBlockingQueue
mDecodeWorkQueue = new LinkedBlockingQueue<Runnable>();
...
}
...
}
創(chuàng)建線程池
調用ThreadPoolExecutor()方法初始化線程池。它會創(chuàng)建管理線程。因為線程池的初始大小和最大池大小是一樣的,ThreadPoolExecutor在初始化時就創(chuàng)建了所有線程對象,如:
...
// Sets the amount of time an idle thread waits before terminating
private static final int KEEP_ALIVE_TIME = 1;
// Sets the Time Unit to seconds
private static final TimeUnit KEEP_ALIVE_TIME_UNIT = TimeUnit.SECONDS;
// Creates a thread pool manager
mDecodeThreadPool = new ThreadPoolExecutor(
NUMBER_OF_CORES, // Initial pool size
NUMBER_OF_CORES, // Max pool size
KEEP_ALIVE_TIME,
KEEP_ALIVE_TIME_UNIT,
mDecodeWorkQueue);
}
相關文章
Android 實現(xiàn)無網(wǎng)絡頁面切換的示例代碼
本篇文章主要介紹了Android 實現(xiàn)無網(wǎng)絡頁面切換的示例代碼,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2017-09-09
Android中的Shape和Selector的結合使用實例
這篇文章主要介紹了Android中的Shape和Selector的結合使用實例,本文直接給出實例代碼,需要的朋友可以參考下2015-06-06
Android開發(fā)獲取手機內網(wǎng)IP地址與外網(wǎng)IP地址的詳細方法與源碼實例
這篇文章主要介紹了Android獲取本機內網(wǎng)IP地址與外網(wǎng)IP地址源碼實例,需要的朋友可以參考下2020-03-03
淺談Android AsyncTask內存安全的一種使用方式
這篇文章主要介紹了淺談Android AsyncTask內存安全的一種使用方式,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2018-08-08
Android 中ActionBar+fragment實現(xiàn)頁面導航的實例
這篇文章主要介紹了Android 中ActionBar+fragment實現(xiàn)頁面導航的實例的相關資料,希望通過本文能幫助到大家實現(xiàn)這樣的功能,需要的朋友可以參考下2017-09-09
Android使用Activity實現(xiàn)簡單的可輸入對話框
大家在做彈出對話框效果的時候最容易想到的是用Dialog顯示,但其實彈出對話框的實現(xiàn)效果有兩種:Dialog和Activity,那么下面這篇文章就來給大家介紹了關于Android使用Activity如何實現(xiàn)一個簡單的可輸入對話框的相關資料,需要的朋友可以參考借鑒,下面來一起看看吧。2017-10-10
Android 使用 Path 實現(xiàn)搜索動態(tài)加載動畫效果
這篇文章主要介紹了Android 使用 Path 實現(xiàn)搜索動態(tài)加載動畫效果,本文通過圖文并茂的形式給大家介紹的非常詳細,需要的朋友可以參考下2018-08-08
Android自定義實現(xiàn)可回彈的ScollView
這篇文章主要為大家詳細介紹了Android自定義實現(xiàn)可回彈的ScollView,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下2022-04-04

