2013-05-01 69 views
6

說我有一個活動在屏幕上顯示一些內容。我需要異步地執行一些方法(asyncMethod),當它完成時,我需要在屏幕上更新數據。什麼是最正確和最簡單的方法呢?在Android中異步執行方法的最佳方式(緊湊且正確)

目前我所知道的最簡單的方法是使用線程:

new Thread(new Runnable() {   
    public void run() { 
     asyncMethod();    
    } 
}).start(); 

我熟悉的AsyncTask,但它比使用線程更復雜,每個方法我需要運行異步有必要創建新的AsyncTask,同時這大大增加了代碼大小。

我想到了一些通用的AsincTask,它將方法作爲參數並執行它,但據我所知,在Java中不可能將方法作爲參數傳遞。

換句話說,我正在尋找非常緊湊(但正確)的方式來異步執行方法。

+0

爲此,您可以使用通用異步任務方法。您可以爲Async創建Generic超類,並從doInBackground和onPostExecute方法調用兩個方法。這些方法可以通過覆蓋這些方法在活動中使用。 – 2013-05-01 11:38:46

回答

3

HandlerLooper

大多數情況下,請將處理程序保存到UI線程的Looper,然後使用它來發布Runnable。例如:

Handler h = new Handler(); 
//later to update UI 
h.post(new Runnable(//whatever); 

PS:HandlerLooper是真棒。這麼多,我對他們來說就是用於Java的remade

+0

看起來與使用線程非常相似。爲什麼它是首選? – Misha 2013-05-01 12:04:36

+0

在內部,UI線程通過循環來循環(例如,它等待Runnable添加到它的循環中,如果找到一個它需要它然後運行它,這就是它如何運行你的應用程序的所有鼠標事件,UI更新等) 。因此,在您的應用程序中,您的普通線程將執行處理,並且只有在UI中需要更新的任何線程纔會發送給UI線程的循環。從而簡化了整個過程。 – Jatin 2013-05-01 12:23:35

0

如果您使用了Command設計模式,並且創建了一個可以運行「命令」對象的通用AsyncTask,則每個任務只需要一個類,而一個通用AsyncTask就可以全部執行它們。甚至可以通過反射或一些預定義的接口方法來製作通用的「命令」來執行方法。

+0

這仍然看起來非常多的代碼異步執行一個方法。需要爲每個方法創建實現Command的類? – Misha 2013-05-01 11:59:28

+0

您可以使用該模式創建一個「命令」,通過Reflections在任何對象上執行任意方法。或者你可以創建一個特定於每個特定對象的特定對象。或者,您可以創建一個接口(或者使用類似於Runnable的接口)並製作一個針對該接口執行的命令。您可能會使用其他模式,但重要的是您可以隨心所欲地獲得,但每個模式都有折衷。 – CodeChimp 2013-05-02 12:51:24

相關問題