java - 使用 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 监听全局变量是否已更改。
解决方案
我创建了一个可行的解决方案:
对于全局变量,我使用了 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
我不确定这是否是最好的解决方案,但它肯定会做它应该做的事情。
推荐阅读
- java - Splash-Screen 在 IDE 中工作,但不能作为 .jar - ANT 有问题吗?
- r - 如何在r中保持具有相同符号的值
- redis - Redis georadius函数可以查询hash数据类型吗
- java - 重定向用户和 POST 参数
- python - 在函数中创建的变量是否具有全局范围?
- javascript - 如何重置每个容器元素的自动编号标题的计数?
- javascript - 中止包含 setInterval 和事件调用的异步函数
- python - 使用条件将浮点数循环到数据框中的 %
- python - 使用另一列作为索引的 Pandas 子字符串
- android - 如何修复“org.apache.http.message.BasicHeader”未实现接口“org.apache.http.NameValuePair”