2013-03-19 100 views
0

第一次在這裏發佈一個問題。剛開始編寫和編寫我的第一個應用程序。同步方法是否在UI線程(Android)的不同線程上運行?

我有了該方法fetchUpdates()的應用程序的類文件:

public synchronized void fetchUpdates() { 
    String[] mURLs = getURLs(); 
    new DownloadJSONData().execute(mURLs[0], mURLs[1]); 
} 

DownloadJSONData是asyncTask從服務器獲取更新和onPostExecute方法使用JSON數組從服務器更新SQLite數據庫。

應用程序的不同組件(小部件和活動)調用此方法以從服務器獲取更新以更新數據庫。

問題:synchronized方法是否在UI線程的單獨線程上運行?如果是這樣,將DownloadJSONData中的代碼移動到同步的fetchUpdates()方法中應該沒有問題吧?如果在連接服務器或從服務器下載數據時有阻礙,它不應該阻止UI線程正確嗎?

動機:我試圖改變fetchUpdates()方法返回一個指示數據庫是否更新的布爾值。然而,因爲它現在(我認爲)fetchUpdates()方法在asyncTaskonPostExecute方法之前完成,因此,fetchUpdates()方法不能指示是否更新數據庫的DownloadJSONData()的調用。如果數據庫在調用後更新,我需要調用fetchUpdates()方法的應用程序組件的行爲不同。

P.S.由於我是編程新手,簡單而詳細的解釋將非常有用。

謝謝!

+0

我有一個問題給你。你爲什麼不在'AsyncTask'的'doInBackground()'方法中更新數據庫?因爲'onPostExecute()'在UI線程上運行,並且可能會導致Hickup。 – tolgap 2013-03-19 09:46:51

+0

這是一個很好的觀點。我會帶來改變。當我編寫代碼時沒有考慮到這一點。感謝您指出了這一點! – fahmy 2013-03-19 09:50:09

回答

1

使用AsyncTask意味着大多數時候調用方法不會馬上知道結果 - 除非您致電AsyncTask.get(),但您不想這樣做並放棄異步方面。 假設您想在數據庫更新時向用戶顯示一條消息,您應該執行的操作是啓動AsyncTask並讓它通過覆蓋正確的方法來處理數據庫更新的返回狀態。我還要在兩個不同的任務分解請求到服務器和數據庫更新:

public class CallServer extends AsyncTask<String, Void, Void> { 

    @Override 
    protected Void doInBackground(String... params) { 
     // Do your request to the server 
     return null; 
    } 

    @Override 
    protected void onPostExecute(Void result) { 
     if (result == SUCCESS) { 
      // Display message to indicate successful request 
      new UpdateDatabase().execute(params); 
     } else { 
      // Display error message or whatever you want to do 
     } 
    } 
} 

public class UpdateDatabase extends AsyncTask<String, Void, Void> { 

    @Override 
    protected Void doInBackground(String... params) { 
     // Update the DB 
     return null; 
    } 

    @Override 
    protected void onPostExecute(Void result) { 
     if (result == SUCCESS) { 
      // Display success message or whatever you want to do 
     } else { 
      // Display error message or whatever you want to do 
     } 
    } 
} 

的主要思想是,AsyncTask應該處理的錯誤/成功案例,而不是它的調用者。

+0

我有一個服務,以給定的時間間隔調用'fetchUpdates()'方法來檢查更新以更新數據庫。假設我在連接到服務器失敗時做了一個敬酒。即使應用沒有按設定的時間間隔聚焦,敬酒也會彈出。理想情況下,當用戶打開應用程序時(MainActivity.class調用onCreate上的fetchUpdates()),我希望吐司只彈出一次**。 – fahmy 2013-03-19 10:10:12

+0

然後,只有當您從主要活動調用狀態消息時,才能顯示狀態消息,並通過將參數傳遞給AsyncTask從服務調用時什麼也不做。只有在應用程序打開時才能調用它,您可以查看http://stackoverflow.com/a/151940/2003420 – bvidal 2013-03-19 10:42:02

6

不,同步方法運行在同一個線程中。但是,其他線程在執行時不能執行另一個同步方法(同一對象)。