編輯:Android開發實例
本節展示如何在線程池裡執行任務。流程是,添加一個任務到線程池的工作隊列,當有線程可用時(執行完其他任務,空閒,或者還沒執行任務),ThreadPoolExecutor會從隊列裡取任務,並在線程裡運行。
本課同時向你展示了如何停止正在運行的任務。
在線程池裡的線程上執行任務
在ThreadPoolExecutor.execute()裡傳入 Runnable對象啟動任務。這個方法會把任務添加到線程池工作隊列。當有空閒線程時,管理器會取出等待最久的任務,在線程上運行。
代碼如下:
public class PhotoManager {
public void handleState(PhotoTask photoTask, int state) {
switch (state) {
// The task finished downloading the image
case DOWNLOAD_COMPLETE:
// Decodes the image
mDecodeThreadPool.execute(
photoTask.getPhotoDecodeRunnable());
...
}
...
}
...
}
當ThreadPoolExecutor啟動Runnable時,會自動調用run()方法。
中斷正在運行的代碼
要停止任務,你需要中斷任務的進程。你需要在創建任務的時候,保存一個當前線程的handle.
如:
代碼如下:
class PhotoDecodeRunnable implements Runnable {
// Defines the code to run for this task
public void run() {
/*
* Stores the current Thread in the
* object that contains PhotoDecodeRunnable
*/
mPhotoTask.setImageDecodeThread(Thread.currentThread());
...
}
...
}
要中斷線程,調用Thread.interrupt()就可以了。提示:線程對象是系統控制的,可以在你的app進程外被編輯。因為這個原因,你需要在中斷它前加訪問鎖,放到一個同步塊裡:
代碼如下:
public class PhotoManager {
public static void cancelAll() {
/*
* Creates an array of Runnables that's the same size as the
* thread pool work queue
*/
Runnable[] runnableArray = new Runnable[mDecodeWorkQueue.size()];
// Populates the array with the Runnables in the queue
mDecodeWorkQueue.toArray(runnableArray);
// Stores the array length in order to iterate over the array
int len = runnableArray.length;
/*
* Iterates over the array of Runnables and interrupts each one's Thread.
*/
synchronized (sInstance) {
// Iterates over the array of tasks
for (int runnableIndex = 0; runnableIndex < len; runnableIndex++) {
// Gets the current thread
Thread thread = runnableArray[taskArrayIndex].mThread;
// if the Thread exists, post an interrupt to it
if (null != thread) {
thread.interrupt();
}
}
}
}
...
}
在大多數案例裡,Thread.interrupt()會馬上停止線程。可是,它只會停止在等待的線程,但不會中斷cpu或network-intensive任務。為了避免系統變慢,你應該在開始嘗試操作前測試等待中斷的請求。
代碼如下:
/*
* Before continuing, checks to see that the Thread hasn't
* been interrupted
*/
if (Thread.interrupted()) {
return;
}
...
// Decodes a byte array into a Bitmap (CPU-intensive)
BitmapFactory.decodeByteArray(
imageBuffer, 0, imageBuffer.length, bitmapOptions);
...
Google的開源Android移動操作系統正在席卷全球智能手機市場,和蘋果不一樣,它對那些想將應用程序提交到iPhone App Store的開發人員有著嚴格的
登錄應用程序的屏幕,詢問憑據登錄到一些特定的應用。可能需要登錄到Facebook,微博等本章介紹了,如何創建一個登錄界面,以及如何管理安全問題和錯誤嘗試。首先,必須定義兩
本文為大家演示了如何使用Chronometer控件實現Android計時器的實
可以顯示在的Android任務,通過加載進度條的進展。進度條有兩種形狀。加載欄和加載微調(spinner)。在本章中,我們將討論微調(spinner)。Spinner 用