从我所读到的内容来看,Android的AsyncTask
是从Internet异步加载信息的好方法。但是,我不想阻止用户界面并阻止用户与之交互。
我的问题的基本描述。
目前,我正在使用websockets来从Web服务器发送/接收数据。在诸如用户进入房间的事件,从播放列表添加或移除的歌曲,正在上调或下调的歌曲,或者一首歌曲结束以及另一首歌曲开始时,必须更新UI以指示改变。但理想情况下,这些更改将经常发生,这意味着不断阻止UI以刷新它将是麻烦和烦人的。
如何在不中断用户活动的情况下更新我的用户界面? AsyncTask
会满足吗?
答案 0 :(得分:1)
asyncTask
不会阻止用户界面。它在一个单独的线程上运行,以从Web发送/接收数据,然后返回结果。当您收到结果时,可以根据需要更新UI。
asyncTask
正在执行其后台工作时,您的用户界面不会停止。您可以通过在活动中构建一个并在doInBackground
方法中暂停一段时间(比如五秒钟)来尝试。您将看到您的UI在五秒钟内仍然可以正常运行。
编辑:你可以对你得到的结果做任何事情,也不会打断你的用户界面。如果情况并非如此,那么您可能希望了解优化内存对象的功能。任何未存储在内存中的内容都应该使用AsyncTask
检索或写入磁盘,数据库或Internet端点。正如评论者指出的那样,这不是使用其他线程的唯一方法,但它很容易,并且如果您正在制作合理的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,但这只是我作为一个例子的方便。
答案 1 :(得分:0)
我不知道你在哪里阅读,但asyn任务是最近进行网络服务呼叫的最佳方式。您应该使用Retrofit进行服务调用,速度提高8倍并顺利处理UI更新。 在这里阅读更多相关信息: -