我创建了一个java服务器和java客户端程序,它们与发送String消息的TCP套接字进行通信。那些java程序运行得很好。客户端逻辑是它有一个 UI 和一个线程,它会一直等待新消息并相应地更新UI收到的消息( ex添加按钮,设置按钮可见,更改文本)。
现在,我对android完全陌生,我想为Android建立一个平等的客户端,但我遇到了这些问题:
1)我无法通过传递参数(如java)从后台线程更新UI。
2)我希望一个线程更新2或3个活动(因为缺少屏幕空间,我需要2-3个)
我已经阅读了 AsyncTask ,但是他们说它建议用于排序任务,然后我读到线程与处理程序,但他们说很难使用,我得到了困惑。所以我的问题是我应该在android上使用什么方法来实现" 消息监听器/ UI更新器"线程。
UPDATE :好的,我使用了线程和处理程序,我的主要活动得到了更新,但现在我怎么能从该线程更新第二个Activitie?
答案 0 :(得分:0)
好吧,你可以在某个特定的时间启动一个线程,然后检查是否有来自服务器的消息,如果没有,重启线程或者你的工作。希望这很有帮助。
答案 1 :(得分:0)
你可以像这样实现它 package 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);
}
}