使用 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
我不确定这是否是最好的解决方案,但它确实做了它应该做的事情。
我在 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
我不确定这是否是最好的解决方案,但它确实做了它应该做的事情。