2011-07-27 37 views
3

我正在尋找關於執行以下任務的最佳途徑一些建議(我現在的方法是很幼稚的,並導致我的問題)如何要等到線程結束

這裏是辦下來了什麼應該在我的應用程序啓動時發生:

  1. 首先提示用戶登錄Facebook。我使用Facebook的 DialogListener來監聽它何時完成。

  2. 完成上述任務後,我使用AsyncFacebookRunner收集有關用戶的一些 信息。我使用 AsyncFacebookRunner.RequestListener()來偵聽此時 何時完成。

  3. 在任務2的完成我存儲在SharedPreferences

一些信息,這一切工作出色。這是問題...我需要使用http POST中的某些信息來獲取服務器上的數據。數據用於填充gridview。爲此我正在使用Asynctask。我的問題在於不知道SharedPreferences中的數據何時存在。

截至目前在doInBackground我有這樣一個循環:

while (true) 
{ 
    if (not a valid value of something in SharedPreferences) 
     Thread.sleep(500); 
    else 
     break 
} 

這是令人難以置信的醜陋的,天真的,並給了我一些問題。在這一點上,我覺得我應該重寫整個事情,所以希望有人可以建議一個更好的方法!

+0

asynctask的onPostExecute()方法不合適嗎?這總是在doInBackground之後執行的,所以如果你在doInBackground中獲得你的首選項,那麼它將在onPostExecute()中可用。 – DeeV

回答

2

註冊與SharedPreferencesOnSharedPreferenceChangedListener通知在它時,數據的變化。

+0

這就是我最終使用的,謝謝! – IamAlexAlright

0

如果我正確理解您的事件順序。當#3正在運行並保存首選項時,它爲什麼不能通知正在寫入SharedPreferences的值的任何內容?活動風格。這將消除您當前使用的旋轉等待。

也許我錯過了什麼?

+0

那麼,作爲一個新的android開發人員(也許有什麼我不知道的),我不能看到一種方式來做到這一點,沒有像我上面的循環:/我不能完全調用Asynctask從第二個onComplete(我寫入sharedpreferences)。也許我想念你說的話:D – IamAlexAlright

+0

@IamAlexAlright:你爲什麼不能從那裏打電話給Asynctask? – netcoder

+0

爲什麼在你正確的共享首選項之後,你不能在你的asynctask上調用.execute? – colithium

0

有各種方法來執行此操作。你可以使用阻塞隊列來做到這一點。所以當有有效的SharedPreferences時,即在隊列中它將被線程使用。

0
private volatile boolean mLock = false; 

void otherThreadFunc() { 
    mLock = true; 
    Thread.sleep(10000); 
    mLock = false; 
} 

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

    // Wait... 
    while(mLock) { 
    } 
}