如何更改GlobalVariables时通知活动

时间:2013-02-02 09:54:11

标签: android android-activity notify

我有一个通过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()之后更改那些静态变量,但是我在通知活动时遇到了麻烦。

1 个答案:

答案 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的实例。服务器既不知道也不关心。它只是说“如果有人感兴趣,我收到了回复,这里是详细信息”。