首页 > 解决方案 > 使用 Runnable 进行多项活动的 UDP 接收器:android studio

问题描述

我在我的 android 应用程序中实现了一个 UPD 接收器。到目前为止,我只有一个 MainAvtivity,并且通过将 MainActivity 传递给 UDPReceiver 类来更新主 UI 中的 TextView。

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

此外,活动的 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();
        }
    }
}   

每当活动发生变化时,我都会重新启动 UDPreceiver 类:

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

没有必要进行后台活动,所以这没关系。

简而言之,如何在我的 UDPReceiver 后台线程(类内)中更新全局变量?是否有一个 eventListener 监听全局变量是否已更改。

标签: javaandroid-studioevent-handlingudprunnable

解决方案


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

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

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();

从现在开始,可以从任何活动中更改和访问该变量:

Global_Singleton.INSTANCE.setIncomingMessage(ProcessedMessage);

为了对来自服务器的新消息做出反应,我在此视频之后使用了 Shared Preference 和 SharedPreferences.OnSharedPreferenceChangeListener: https ://www.youtube.com/watch?v=XEDmE-pnhqs

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


推荐阅读