如何顺利更新UI?

时间:2016-06-10 03:59:45

标签: android multithreading user-interface android-asynctask websocket

从我所读到的内容来看,Android的AsyncTask是从Internet异步加载信息的好方法。但是,我不想阻止用户界面并阻止用户与之交互。

我的问题的基本描述。

目前,我正在使用websockets来从Web服务器发送/接收数据。在诸如用户进入房间的事件,从播放列表添加或移除的歌曲,正在上调或下调的歌曲,或者一首歌曲结束以及另一首歌曲开始时,必须更新UI以指示改变。但理想情况下,这些更改将经常发生,这意味着不断阻止UI以刷新它将是麻烦和烦人的。

如何在不中断用户活动的情况下更新我的用户界面? AsyncTask会满足吗?

2 个答案:

答案 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更新。 在这里阅读更多相关信息: -

http://googleweblight.com/?lite_url=http://instructure.github.io/blog/2013/12/09/volley-vs-retrofit&ei=qR4bQU5c&lc=en-IN&s=1&m=260&host=www.google.co.in&ts=1465531978&sig=APY536z0v15lfX3G6KY4nls4wf1kzttJdA