首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Android:如何制作等待服务器消息并更新UI的线程?

Android:如何制作等待服务器消息并更新UI的线程?
EN

Stack Overflow用户
提问于 2017-04-22 15:23:39
回答 2查看 150关注 0票数 0

我制作了一个java服务器和java客户端程序,它们与发送字符串消息的TCP套接字进行通信。这些java程序工作得很好。客户端逻辑是它有一个 UI 和一个线程,它一直在等待新消息,并相应地更新它接收到的消息(e.x )。添加按钮,设置按钮可见,更改文本)。

现在,我对android完全陌生,我想为android做一个平等的客户,但我面临着这些问题:

1)我不能仅仅通过传递参数(比如java)从后台线程更新UI。

2)我希望一个线程更新2或3个活动(因为缺少屏幕空间,我需要2-3 )。

我读过关于AsyncTask的文章,但是他们说它被推荐用于排序任务,然后我读到了带有处理程序的线程,但是他们说很难使用,我感到很困惑。因此,我的问题是,我应该在android上使用什么方法来实现“消息侦听器/UI更新器”线程。

update :好的,我使用了线程和处理程序,我的主要活动也被更新了,但是现在我如何从这个线程更新第二个Activitie呢??

EN

回答 2

Stack Overflow用户

发布于 2017-04-22 15:29:00

那么,您可以在特定的时间内启动一个线程,然后检查是否有来自服务器的消息,如果没有,重新启动线程,否则执行您的工作。希望这会有帮助。

票数 0
EN

Stack Overflow用户

发布于 2017-04-23 10:58:53

您可以像这个包com.example.a41264.myapplication那样实现它;

代码语言:javascript
复制
import java.io.IOException;
import java.io.InputStream;
import java.net.InetSocketAddress;
import java.net.Socket;
import java.net.SocketAddress;
import java.net.UnknownHostException;
import java.util.concurrent.CopyOnWriteArrayList;

/**
 * Created by 41264 on 04/23/17.
 */

public class Client implements Runnable{
   final  CopyOnWriteArrayList<MsgListener> listeners = new CopyOnWriteArrayList<>();
    @Override
    public void run() {
        Socket socket = new Socket();
        try {
            int yourPort = 0;
            SocketAddress address = new InetSocketAddress("your ip",yourPort);
            socket.connect(address);
            int your_buffer_size = 1024;
            byte[] buffers = new byte[your_buffer_size];
            InputStream is = socket.getInputStream();
            int resultLength;
            String msg;
            while(true){
                resultLength = is.read(buffers);
                msg = new String(buffers,0,resultLength);
                if(listeners.size() != 0){
                    for(MsgListener msgListener: listeners){
                        msgListener.onMsgRecived(msg);
                    }
                }
            }
        } catch (UnknownHostException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    public void addListener(MsgListener listener){
        listeners.add(listener);
    }
    public void removeListener(MsgListener listener){
        listeners.remove(listener);
    }

    public interface MsgListener{
        void onMsgRecived(String msg);
    }
}

在这样的活动中工作

代码语言:javascript
复制
package com.example.a41264.myapplication;

import android.app.Activity;
import android.util.Log;

/**
 * Created by 41264 on 04/23/17.
 */

public class YourActivity extends Activity{

    private Client client; //you need to get your clent;

    private Client.MsgListener msgListener = new Client.MsgListener() {
        @Override
        public void onMsgRecived(final String msg) {
            runOnUiThread(new Runnable() {
                @Override
                public void run() {
                    //do your own work in main thread
                    Log.i("tag",msg);
                }
            });
        }
    };

    @Override
    protected void onRestart() {
        super.onRestart();
        client.addListener(msgListener);
    }

    @Override
    protected void onStop() {
        super.onStop();
        client.removeListener(msgListener);
    }
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/43560951

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档