android - 更改 GlobalVariables 时如何通知 Activity

标签 android android-activity notify

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

当我发送如下消息时:request:x
我得到响应:response:x:55

我需要根据收到的回复更改我的 Activity 。目前我通过将 Activity 和 Activity 类对象传递给 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);
        }
    });
}   

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

最佳答案

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

定义一个接口(interface)并使用回调让 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);
}

在您的 Activity 中:

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 服务器不知道这些 Activity 。它只是回调任何已注册的监听器。这些听众可能是 Activity ,也可能是服务。它们可能是 MySparklyUnicorn 的实例。服务器既不知道也不关心。它只是说“如果有人感兴趣,我已经收到回复,这里是详细信息”。

关于android - 更改 GlobalVariables 时如何通知 Activity ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14660671/

相关文章:

android - 将抽屉导航添加到现有的 Android 谷歌地图

android - 当应用程序关闭并收到通知时,MvvmCross 如何在通知服务中初始化?

Android - 全局跟踪看不见的通知,最佳实践

android - 如何关闭 VideoView Activity(目前必须按两次返回)

java - 该等待/通知代码性能异常

android - 还原 ADT (Android Development Tools) Perspective Eclipse

android - 在 ListView 上禁用波纹

Android onResume 在 onNewIntent 之后没有被调用

java - Java 线程(大学练习)

java - 在notify()之后线程不恢复执行