2013-01-24 51 views
0

我有一個Listview和一個適配器連接到它的活動。我有一個同步數據並保存的類。 (我認爲我們不應該關心數據來自何處)並且它運行在不同的線程上。現在我想知道更新適配器的乾淨方式,但我們不應該在該類運行不同的線程時調用該類的任何活動函數。更新在不同線程上運行的其他類的Android活動的UI

我知道的一種方法是在活動中創建處理程序並將其傳遞給其他類並從此處使用它。但是我想知道活動是否在後臺,那麼活動的功能可以由UI線程調用,或者只在活動進入前臺時調用。

我不想錯過任何更新,並希望在前臺更新活動。

+0

你有沒有嘗試過在Android中使用'Loaders' api? – Supreethks

+0

我寧願使用Handler的方法。這很容易實現,你可以通過任何你想要的消息。obj – mihail

回答

0

該代碼會做你想要什麼:

  runOnUiThread(new Runnable() { 
       @Override 
       public void run() { 
        //your actions 
       } 
     }); 
+0

如果我想在run方法中調用一些activity的函數,我需要引用activity對象,這與在UI線程上具有句柄並請求可運行的對象類似。但是我不想在後臺調用活動函數,我希望函數只在前臺運行時執行,因爲可能會有N個不同的活動,我不想全部更新,我只想更新前臺活動和其他應該在他們來到前臺時打電話。 – user1875798

0

,因爲它可以運行在不同的線程,我們不應該從這個類調用活動的任何功能。

這是錯誤的。 (Java中的對象不是在一個線程運行。你可以說的是,一個方法是在從該方法被調用的線程中運行)

Android中(在大多數的UI框架)的規則這個:

你只能從UI線程調用一個方法更新UI。

如果你有一些代碼在一個線程(不是UI線程)上運行,如果該代碼需要更新UI:您可以使用UI線程的Handler發佈UI更新代碼到UI線程。如果當您發佈某些內容以更新它的UI時,該活動不在前臺:nevermind!您剛剛發佈的代碼將在未來的某個時間點執行。

1

  1. 從您的工作者類發送broadcastIntent並將BroadcastReceiver添加到您的活動中,當您收到正確的消息時,更新您的列表視圖。

  2. 第二種方法是在你的活動延伸AsyncTask並在doInBackground()做你的工作,並在onPostExecute(result)更新您的列表視圖中創建私有或公共類。

  3. 我可以想象的第三種方式,但我不認爲這是創建靜態方法的最佳方式,您可以從任何其他類中使用它來更新UI。

您至少在我看來可以用在這裏的最好的東西是AsyncTask

相關問題