我有一个通过USB线连接到计算机的Android应用程序。我使用TCPServer类发送消息和监听。例如:
当我发送消息时:请求:x
我收到回复:回复:x:55
我需要根据我得到的回复对我的活动进行更改。目前,我通过将活动和活动类对象传递给TCPServer的构造函数
来暂时解决问题public TCPServer(int portNum, Activity activity, IntroActivity ia) {
super();
port = portNum;
this.activity = activity;
this.ia = ia;
}
然后我收到回复后:
void updateButton(final int color, final String txt) {
activity.runOnUiThread(new Runnable() {
public void run() {
ia.getConnectionButton().setBackgroundColor(color);
ia.getConnectionButton().setText(txt);
}
});
}
如你所见,这根本没有效果。每当收到相关变量时,我都需要以某种方式通知活动。我使用Class for GlobalVariables并在listen()之后更改那些静态变量,但是我在通知活动时遇到了麻烦。
答案 0 :(得分:5)
首先,传递Activity实例几乎总是不好的做法。这是一个糟糕的时刻。
定义一个接口并使用回调让活动知道已收到响应。
public interface ResponseReceivedListener {
void onResponseReceived(int arg1, string arg2); ..<----add arguments you want to pass back
}
在您的TCPServer类中
ArrayList<ResponseReceivedListener> listeners = new ArrayList<ResponseReceivedListener>();
...
public void addResponseReceivedListener(ResponseReceivedListener listener){
if (!listeners.contains(listener){
listeners.add(listener);
}
}
public void removeResponseReceivedListener(ResponseReceivedListener listener){
if (listeners.contains(listener){
listeners.remove(listener);
}
}
收到回复时
for (ResponseReceivedListener listener:listeners){
listener.onResponseReceived(arg1, arg2);
}
在您的活动中:
public class MainActivity extends Activity implements ResponseReceivedListener {
...
@Override
public void onCreate(Bundle savedInstanceState)
{
...
tcpServer.setResponseReceivedistener(this);
...
}
public void onResponseReceived(int arg1, string arg2){
// do whatever you need to do
}
全部来自记忆所以请原谅错别字。
这种方法解耦了类。 TCP服务器不了解这些活动。它只是回调任何已注册的监听器。那些听众可能是活动,他们可能是服务。它们可能是MySparklyUnicorn的实例。服务器既不知道也不关心。它只是说“如果有人感兴趣,我收到了回复,这里是详细信息”。