Android 在一個線程中執(zhí)行一段特定的代碼

2018-08-02 18:27 更新

編寫:AllenZheng1991 - 原文:http://developer.android.com/training/multiple-threads/define-runnable.html

這一課向你展示了如何通過實現(xiàn) Runnable接口得到一個能在重寫的Runnable.run()方法中執(zhí)行一段代碼的單獨的線程。另外你可以傳遞一個Runnable對象到另一個對象,然后這個對象可以把它附加到一個線程,并執(zhí)行它。一個或多個執(zhí)行特定操作的Runnable對象有時也被稱為一個任務(wù)。

ThreadRunnable只是兩個基本的線程類,通過他們能發(fā)揮的作用有限,但是他們是強(qiáng)大的Android線程類的基礎(chǔ)類,例如Android中的HandlerThreadAsyncTaskIntentService都是以它們?yōu)榛A(chǔ)。ThreadRunnable同時也是ThreadPoolExecutor類的基礎(chǔ)。ThreadPoolExecutor類能自動管理線程和任務(wù)隊列,甚至可以并行執(zhí)行多個線程。

定義一個實現(xiàn)Runnable接口的類

直接了當(dāng)?shù)姆椒ㄊ峭ㄟ^實現(xiàn)Runnable接口去定義一個線程類。例如:

public class PhotoDecodeRunnable implements Runnable {
    ...
    @Override
    public void run() {
        /*
         * 把你想要在線程中執(zhí)行的代碼寫在這里
         */
        ...
    }
    ...
}

實現(xiàn)run()方法

在一個類里,Runnable.run() 包含執(zhí)行了的代碼。通常在Runnable 中執(zhí)行任何操作都是可以的,但需要記住的是,因為Runnable 不會在UI線程中運行,所以它不能直接更新UI對象,例如View 對象。為了與UI對象進(jìn)行通信,你必須使用另一項技術(shù),在與UI線程進(jìn)行通信 這一課中我們會對其進(jìn)行描述。

Runnable.run())方法的開始的地方通過調(diào)用參數(shù)為THREAD_PRIORITY_BACKGROUND 的Process.setThreadPriority()方法來設(shè)置線程使用的是后臺運行優(yōu)先級。 這個方法減少了通過Runnable創(chuàng)建的線程和和UI線程之間的資源競爭。

你還應(yīng)該通過在Runnable 自身中調(diào)用Thread.currentThread()來存儲一個引用到Runnable對象的線程。

下面這段代碼展示了如何創(chuàng)建run()方法:

class PhotoDecodeRunnable implements Runnable {
...
    /*
     * 定義要在這個任務(wù)中執(zhí)行的代碼
     */
    @Override
    public void run() {
        // 把當(dāng)前的線程變成后臺執(zhí)行的線程
        android.os.Process.setThreadPriority(android.os.Process.THREAD_PRIORITY_BACKGROUND);
        ...
        /*
         * 在PhotoTask實例中存儲當(dāng)前線程,以至于這個實例能中斷這個線程
         */
        mPhotoTask.setImageDecodeThread(Thread.currentThread());
        ...
    }
...
}


以上內(nèi)容是否對您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號
微信公眾號

編程獅公眾號