2011-07-07 103 views
1

我是android開發新手。我想完成描述任務如下:處理UI的Android異步任務

  • 主activty它調用外部類(其他類將擴大AsyncTask)來解析xml和請求的Web服務接收json並啓動ProgressDialog
  • 該類執行xmljson解析其doInBackground方法。
  • 在解析完成後的onPostExecute方法中,關閉主活動中設置的ProgressDialog
  • 我可以通過將ProgressDialog對象傳遞給解析類並在其onPostExecute方法中關閉同一對象。

我想通過UI對象的實例作爲參數不是一個好方法程序,希望必須有一些其他的方式來解決。

請建議。 謝謝

回答

4

脫鉤這些最簡單的方法是使用一個接口:

  1. 定義回撥接口(姑且稱之爲WorkDoneListener)有一個方法:workDone()
  2. 聲明您的活動類以實施WorkDoneListener並實施workDone()以關閉對話框。
  3. 定義AsyncTask的構造函數以接受WorkDoneListener。將參考存放在成員字段中。
  4. onPostExecute中,調用聽衆的方法workDone()
+2

+1 :)在理論上,他仍然會這樣,我引用了「將實例傳遞給AsyncTask」。我想知道OP是否在印象之下複製整個實例? – JustDanyul

+2

好點。就像在Java中所有這樣的調用中一樣,實例不會被複制,這既是好事也是壞事。好,因爲它不會創建沒有好理由的對象。不好的,因爲這可能是內存泄漏的來源,特別是如果異步任務需要在配置更改的情況下繼續工作,會導致活動中斷。 –

+1

是的,如果參考未清除,您將在方向開關上泄漏原始活動及其所有視圖。當活動正在消失時,您需要處理這種情況,並在活動重新創建後分離並重新附加。 – dmon

1

Ted的回答是,如果你的AsyncTask太大,你要聲明它在其他文件中,你應該做的。但是,請記住,通常你聲明AsyncTask你的UI類中:

public class YourActivity extends Activity{ 
    private class YourAsyncTask extends AsynkTask<etc.>{ 
    } 
} 

事實上,如果你正在使用你AsyncTask僅從這一活動(我的意思是,如果你不使用任何其他地方)宣佈AsyncTask作爲一個內部類是一個很好的設計實踐。