使用 Runnable 的多个活动中的 UDP 接收器:android studio

UDP receiver in mulitple activities using Runnable: android studio

我在 android 应用程序中实现了 UPD 接收器。到目前为止,我只有一个 MainAvtivity,我通过将 MainActivity 传递给 UDPReceiver class.

在 Main UI 中更新了一个 TextView

现在我有第二个 activity,我希望我的 UDP 接收器更新一个全局字符串变量,然后可以由当前活动的 activity 访问。

另外,活动 Activity 需要有一个侦听器来知道何时有新的 UDP 消息。这是我的 UDPreceiver 的代码。

public class UDPglobalReceiver extends AppCompatActivity implements Runnable {
    private final int listen2port = 12345;
    private String receivedMessage;
    public globalApplication application;

    @Override
    public void run() {
        try (DatagramSocket myclientSocket = new DatagramSocket(null)) {

            myclientSocket.setReuseAddress(true);
            myclientSocket.setBroadcast(true);
            myclientSocket.bind(new InetSocketAddress(listen2port));

            while (true) {
                byte[] buffer = new byte[256]; // maybe make it smaller if the messages are certainly smaller (max UDP payload)
                DatagramPacket mydatagramPacket = new DatagramPacket(buffer, 0, buffer.length);
                myclientSocket.receive(mydatagramPacket);
                receivedMessage = new String(mydatagramPacket.getData(), "UTF8");
                Log.d("UDP", "---------------- UDP: " + receivedMessage);

                final String[] ProcessedMessage = receivedMessage.split("\."); // Seperate by .

            }
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}   

只要 activity 发生变化,我就会重新启动 UDPreceiver class:

// Start the UDP background thread 
Thread myPiUDPListener = new Thread(new UDPglobalReceiver());// Create a Thread to listen UDP
myPiUDPListener.start();

不需要后台activity这样就可以了。

简而言之,问题是如何更新我的 UDPReceiver 后台线程中的全局变量(在 class 中)? 有没有eventListener监听一个全局变量是否被改变

我创建了一个可行的解决方案:

对于全局变量,我使用了单例设计模式,我在其中创建了一个 class,如下所示:

import android.app.Application;
import android.util.Log;

public final class Global_Singleton extends Application {

    public static volatile Global_Singleton INSTANCE = null;

    private Global_Singleton() {}

    // Thread safe by synchronized
    // https://www.youtube.com/watch?v=vSxKnvxe8v0
    public static Global_Singleton getInstance() {
        if (INSTANCE == null) {
            synchronized (Global_Singleton.class) {
                if (INSTANCE == null) { // double check locking
                    INSTANCE = new Global_Singleton();
                }
            }
        }
        return INSTANCE;
    }

    // ----------  UDP incoming data ----------
    private String[] ProcessedMessage;

    public String[] getIncomingMessage() {
        return ProcessedMessage;
    }

    public void setIncomingMessage(String[] processedMessage) {
        ProcessedMessage = processedMessage;
        Log.d("MINE", "---------------- Global_Singleton: " + ProcessedMessage[0]);
    }

}

在我的 MainActivity 中,我使用以下行调用它:

Global_Singleton.getInstance();

从现在开始,可以从任何 activity:

更改和访问变量
Global_Singleton.INSTANCE.setIncomingMessage(ProcessedMessage);

为了响应来自服务器的新消息,我使用了共享首选项和此视频后的 SharedPreferences.OnSharedPreferenceChangeListener: https://www.youtube.com/watch?v=XEDmE-pnhqs

我不确定这是否是最好的解决方案,但它确实做了它应该做的事情。