1

我有一个通过 USB 电缆连接到计算机的 android 应用程序。我使用 TCPServer 类来发送消息和收听。例如:

当我发送如下消息时:request:x
我得到响应:response: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);
        }
    });
}   

如您所见,这根本没有效果。每当收到相关变量时,我都需要以某种方式通知活动。我为 GlobalVariables 使用了一个类,并在 listen() 之后更改了这些静态变量,但是我在通知活动时遇到了麻烦。

4

1 回答 1

5

首先,传递 Activity 实例几乎总是不好的做法。这是一个糟糕的时期。

定义一个接口并使用回调让活动知道已收到响应。

public interface ResponseReceivedListener {
    void onResponseReceived(int arg1, string arg2); // <- add arguments you want to pass back
}

在您的 TCPServer 类中:

ArrayList<ResponseReceivedListener> listeners = new ArrayList<>();

// ...

public void setResponseReceivedListener(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.setResponseReceivedListener(this);

        // ...
    }

    public void onResponseReceived(int arg1, string arg2) {
        // do whatever you need to do
    }

    // ...
}

全部凭记忆,如有错别字请见谅。

这种方法将类解耦。TCP 服务器不知道这些活动。它只是回调任何注册的监听器。这些听众可能是活动,他们可能是服务。它们可能是 MySparklyUnicorn 的实例。服务器既不知道也不关心。它只是说“如果有人感兴趣,我已经收到了回复,这是详细信息”。

于 2013-02-02T10:11:25.937 回答