Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/227.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 长时间的网络操作需要在Android中多次更新UI_Java_Android_Multithreading - Fatal编程技术网

Java 长时间的网络操作需要在Android中多次更新UI

Java 长时间的网络操作需要在Android中多次更新UI,java,android,multithreading,Java,Android,Multithreading,我的活动向用户显示从web服务器下载的一些数据。数据可能会随着时间的推移而变化,因此web服务器会向连接的客户端传递新的更新 因此,我的应用程序的工作基本上是: while ( true ) { wait for updates; update the UI; } 这段代码可以永远运行,在它的生命周期中,它应该多次更新UI 我应该使用什么类来实现此代码 Thread或Runnable似乎是解决我问题的最简单的方法,但是我如何与UI线程通信呢?您可能应该执行一个异步任务,在需要更新U

我的活动向用户显示从web服务器下载的一些数据。数据可能会随着时间的推移而变化,因此web服务器会向连接的客户端传递新的更新

因此,我的应用程序的工作基本上是:

while ( true ) {
   wait for updates;
   update the UI;
}
这段代码可以永远运行,在它的生命周期中,它应该多次更新UI

我应该使用什么类来实现此代码


Thread
Runnable
似乎是解决我问题的最简单的方法,但是我如何与UI线程通信呢?

您可能应该执行一个异步任务,在需要更新UI时调用runOnUiThread。查看应如何使用
activity.runOnUiThread()


IMHO
AsyncTask
是首选,因为它通过
onPreExecute()
onPostExecute()
,onServerChangesListener()对后台任务进行更细粒度的控制。。。刷新用户界面

public void serverStateWrappr(){

Handler messageHandler = new Handler() {            
    public void handleMessage(Message msg) {
        super.handleMessage(msg);
        _localstr = getStuff((String) msg.obj)
        updateAdapter(_localstr)
    }}
从有把手的线开始

            while (onChangesForClient) {                 
                    Message msg = Message.obtain();
                    msg.what=1;
                    msg.obj=newData;
                    //TODO this is the comment for UI 
                    mhandleRef.sendMessage(msg);
                }
            }

你决定是“拉”还是“推”了吗。。这推动了对同步协议的一些选择…IMO-您可以查看PubSub(rabbitmq),以便您的服务器在状态更改时只发布一次。。。rabbit和具有活动会话的活动客户端的组合只需在适当的时间间隔内执行rabbit等效的“刷新”。我相信只要“拉”到客户端时间线的任何更新即可。谢谢#Robert,但我的问题与以下事实有关:长网络操作没有在UI线程上运行,因此如果此线程尝试更新UI,则会引发异常。将“处理程序”引用传递到线程中。当线程中的状态发生变化时,只需通过处理程序“获取/发送”MSG。UI响应来自线程的消息,解析msg.body并刷新UI。我将尝试此解决方案,但每次更新后必须创建一个新的
AsyncTask
。在我看来,
AsyncTask
的这种用法有点奇怪。请注意,AsyncTask不适合较长的操作,存在许多已知问题。