asyncTask
不會阻止用戶界面。它在單獨的線程上運行以發送/接收來自Web的數據,然後返回結果。當您收到結果時,您可以根據您的選擇更新UI。
當asyncTask
執行其後臺工作時,您的用戶界面將不會停止。你可以通過在你的活動中建立一個,並在doInBackground
方法中簡單地睡一段時間(比如5秒)來嘗試。你會看到你的用戶界面在5秒內仍然有效。
編輯:你可以對你回來的結果做任何事情,它也不會中斷你的用戶界面。如果情況並非如此,那麼您可能需要考慮如何優化內存對象的操作。任何未存儲在內存中的內容都可能被檢索或寫入到磁盤,數據庫或因特網終端,其編號爲AsyncTask
。正如評論者指出的那樣,這不是使用其他線程的唯一方式,但如果您提出合理的Web請求並期望用戶擁有良好的連接,則這很容易,並且可能會起作用。你只是想確保你有超時和異常的覆蓋,以便你的應用程序不會崩潰,如果任務需要比預期更長的時間。
public class LoadCommentList extends AsyncTask<Integer, Integer, List<Comment>> {
private String commentSubject;
public LoadCommentList(commentSubject){
this.commentSubject = commentSubject;
}
// Do the long-running work in here
protected List<Comment> doInBackground(Integer... params) {
// the data producer is a class I have to handle web calls
DataProducer dp = DataProducer.getInstance();
// here, the getComments method makes the http call to get comments
List<Comment> comments = dp.getComments(commentSubject);
return comments;
}
// This is called each time you call publishProgress()
protected void onProgressUpdate(Integer... progress) {
// setProgressPercent(progress[0]);
}
// This is called when doInBackground() is finished
protected void onPostExecute(List<Comment> comments) {
// calls a method in the activity to update the ui
updateUI(comments);
}
}
實際上使用Integer ... params的例子有更清晰的例子,但這只是一個我很方便的例子。
的AsyncTask是不是唯一的方式。還有Handler和Loopers,你可以在[與UI線程交流](https://developer.android.com/training/multiple-threads/communicate-ui.html)中閱讀有關信息,然後保持您的應用程序響應。 –