UDP接收器在多个活动中使用Runnable:androidstudio



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

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

此外,活动的"活动"需要有一个侦听器来知道何时有新的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来侦听全局变量是否已更改。

我创建了一个有效的解决方案:

对于全局变量,我使用了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);

为了对来自服务器的新消息作出反应,我使用了SharedPreferences和SharedPreferences。OnSharedPreferenceChangeListener关注此视频:https://www.youtube.com/watch?v=XEDmE-pnhqs

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

最新更新