0

所以從我讀過的內容來看,Android的AsyncTask是異步加載Internet信息的好方法。但是,我不想阻止用戶界面並阻止用戶與其交互。如何順利更新用戶界面?

我的問題的基本描述。

目前,我使用websockets來發送/接收來自Web服務器的數據。在進入房間的用戶,從播放列表中添加或刪除的歌曲,上調或下調的歌曲,或一首歌曲結束,另一首歌曲開始的事件中,必須更新UI以便指示變化。但理想情況下,這些變化將非常頻繁地發生,這意味着不斷屏蔽用戶界面以刷新它將會非常麻煩和煩人。

如何在不中斷用戶活動的情況下更新我的UI? AsyncTask足夠嗎?

+0

的AsyncTask是不是唯一的方式。還有Handler和Loopers,你可以在[與UI線程交流](https://developer.android.com/training/multiple-threads/communicate-ui.html)中閱讀有關信息,然後保持您的應用程序響應。 –

回答

1

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的例子有更清晰的例子,但這只是一個我很方便的例子。

+0

因此,如果我使用的是socket.io,那麼我會在Activity或AsyncTask中設置套接字連接的位置? – Quontas

+0

使用您的AsyncTask來完成長時間運行的工作。我已經更新了答案以示例。在AsyncTask中設置您的套接字連接,但您可以使用其他類或方法實際執行此操作,以保持代碼清潔和可讀。 –

+0

那麼AsyncTask只運行一次?如果它只運行一次,有沒有一種AsyncTask不斷運行的方法? – Quontas