我制作了一个java服务器和java客户端程序,它们与发送字符串消息的TCP套接字进行通信。这些java程序工作得很好。客户端逻辑是它有一个 UI 和一个线程,它一直在等待新消息,并相应地更新它接收到的消息(e.x )。添加按钮,设置按钮可见,更改文本)。
现在,我对android完全陌生,我想为android做一个平等的客户,但我面临着这些问题:
1)我不能仅仅通过传递参数(比如java)从后台线程更新UI。
2)我希望一个线程更新2或3个活动(因为缺少屏幕空间,我需要2-3 )。
我读过关于AsyncTask的文章,但是他们说它被推荐用于排序任务,然后我读到了带有处理程序的线程,但是他们说很难使用,我感到很困惑。因此,我的问题是,我应该在android上使用什么方法来实现“消息侦听器/UI更新器”线程。
update :好的,我使用了线程和处理程序,我的主要活动也被更新了,但是现在我如何从这个线程更新第二个Activitie呢??
发布于 2017-04-22 15:29:00
那么,您可以在特定的时间内启动一个线程,然后检查是否有来自服务器的消息,如果没有,重新启动线程,否则执行您的工作。希望这会有帮助。
发布于 2017-04-23 10:58:53
您可以像这个包com.example.a41264.myapplication那样实现它;
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);
}
}在这样的活动中工作
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);
}
}https://stackoverflow.com/questions/43560951
复制相似问题