Java 仅当Android中的HashMap数据发生更改时才向服务器发送数据
过去一周我一直在研究这个逻辑,但运气不好。有人能帮我吗?所以我遇到的问题是,我使用了信标概念(Moko beacon),它使用bindService扫描信标,直到应用程序被销毁。所以我一直都能得到信标数据 这是我的密码:Java 仅当Android中的HashMap数据发生更改时才向服务器发送数据,java,android,hashmap,beacon,Java,Android,Hashmap,Beacon,过去一周我一直在研究这个逻辑,但运气不好。有人能帮我吗?所以我遇到的问题是,我使用了信标概念(Moko beacon),它使用bindService扫描信标,直到应用程序被销毁。所以我一直都能得到信标数据 这是我的密码: public class MainActivity extends AppCompatActivity implements MokoScanDeviceCallback { private MokoService mMokoService; p
public class MainActivity extends AppCompatActivity implements
MokoScanDeviceCallback {
private MokoService mMokoService;
private HashMap<String, BeaconXInfo> beaconXInfoHashMap;
public ArrayList<BeaconXInfo> beaconXInfos;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
bindService(intent, mServiceConnection, BIND_AUTO_CREATE);
beaconXInfoHashMap = new HashMap<>();
beaconXInfos = new ArrayList<>();
}
public void onScanDevice(DeviceInfo device) {
final BeaconXInfo beaconXInfo = beaconXInfoParseable.parseDeviceInfo(device);
if (beaconXInfo == null) {
return;
}
beaconXInfoHashMap.put(beaconXInfo.mac, beaconXInfo);
updateDevices();
}
private void updateDevices() {
Collections.sort(beaconXInfos, new Comparator<BeaconXInfo>() {
@Override
public int compare(BeaconXInfo lhs, BeaconXInfo rhs) {
Log.e("beaconXinfo", String.valueOf(beaconXInfos.toString()));
if (lhs.rssi < rhs.rssi){
for (int i = 0 ; i < beaconXInfos.size();i++){
if ((beaconXInfos.get(i).rssi > -40)){
NotificationHelper notificationHelper = new NotificationHelper(MainActivity.this);
notificationHelper.CreateNotification(beaconXInfos.get(i).mac,"enter");
}else if ((beaconXInfos.get(i).rssi < -40)){
NotificationHelper notificationHelper = new NotificationHelper(MainActivity.this);
notificationHelper.CreateNotification(beaconXInfos.get(i).mac,"exit");
}
}
}
return 0;
}
});
}
正如您在上面看到的,上一个日志中的数据发生了更改,我只想在hashmap中的数据发生更改时将数据发送到服务器
首先我发送数据“F5:5E:B1:65:94:4B”,因为只有一个值。接下来,我需要将这个hashmap与下一个hashmap进行比较,在下一个hashmap中,名为“55:46:4F:D2:72:5A”的数据发生了变化。我需要发送此数据,忽略“F5:5E:B1:65:94:4B”
与此类似,如何仅将此“C8:DE:FE:45:50:02”值与之前的hashmap相比发送到服务器
因此,如何将hashmap数据的第一个日志与下一系列hashmap数据进行比较,在这里,我只能获取最新的值并将其发送到服务器
在发布这篇文章之前,我已经研究了很多问题,如下所示:
也许我可能会与我在代码中使用的上述内容相混淆
如果需要在代码中添加任何内容,请在下面进行评论。如有任何建议和答案,将不胜感激。提前感谢。最简单的方法是首先拆分您的
beaconXinfo
。不知道如何做到这一点,但您可以将其反序列化,或者使用正则表达式将其分解并提取MAC地址
一旦您有了MAC地址列表(或对其进行迭代的方法),请使用哈希集,该哈希集将公开一个名为contains
的方法,该方法允许您检查集合中是否已经存在字符串
如果字符串在集合中不存在,则表示这是新的内容,您需要将其发送到服务器。如果它存在,则表示您已经看到了该字符串,并且没有必要发送它。最简单的方法是首先拆分您的
beaconXinfo
。不知道如何做到这一点,但您可以将其反序列化,或者使用正则表达式将其分解并提取MAC地址
一旦您有了MAC地址列表(或对其进行迭代的方法),请使用哈希集,该哈希集将公开一个名为contains
的方法,该方法允许您检查集合中是否已经存在字符串
如果字符串在集合中不存在,则表示这是新的内容,您需要将其发送到服务器。如果它存在,则表示您已经看到该字符串,并且没有必要发送它。为什么不每次扫描设备时,检查它是否存在,然后发送它
public void onScanDevice(DeviceInfo device) {
final BeaconXInfo beaconXInfo = beaconXInfoParseable.parseDeviceInfo(device);
if (beaconXInfo == null) {
return;
}
if (!beaconXInfoHashMap.containsKey(beaconXInfo.mac)) {
// new, send it
}
beaconXInfoHashMap.put(beaconXInfo.mac, beaconXInfo);
updateDevices();
}
为什么每次扫描设备时,你不检查它是否存在,然后发送它
public void onScanDevice(DeviceInfo device) {
final BeaconXInfo beaconXInfo = beaconXInfoParseable.parseDeviceInfo(device);
if (beaconXInfo == null) {
return;
}
if (!beaconXInfoHashMap.containsKey(beaconXInfo.mac)) {
// new, send it
}
beaconXInfoHashMap.put(beaconXInfo.mac, beaconXInfo);
updateDevices();
}
beaconXInfos
似乎没有在onScanDevice
方法中更新。beaconXInfos
似乎没有在onScanDevice
方法中更新。嘿,感谢您的快速回复。我试试看。非常感谢@AliI以beacxonhashmap的形式获取BeacxInFoHashMap数据:{F5:5E:B1:65:94:4B=BeacxInfo{name='BeaconX',mac='F5:5E:B1:65:94:4B'},55:46:4F:72:5A=BeacxInfo{name='UFO',mac='55:46:4F:D2:72:5A'},C8:DE:45:50:02=BeacxInfo name='null',mac='C8:DE:FE:45:50'},我不明白它的值是什么意思吗,你在哪里买的?hashmap键是beaconXInfoHashMap的mac地址。当我把beaconXInfo的mac地址放在beaconXInfoHashMap@AliOk中时,我得到了它,我会发送给@AliHey,谢谢你的快速回复。我试试看。非常感谢@AliI以beacxonhashmap的形式获取BeacxInFoHashMap数据:{F5:5E:B1:65:94:4B=BeacxInfo{name='BeaconX',mac='F5:5E:B1:65:94:4B'},55:46:4F:72:5A=BeacxInfo{name='UFO',mac='55:46:4F:D2:72:5A'},C8:DE:45:50:02=BeacxInfo name='null',mac='C8:DE:FE:45:50'},我不明白它的值是什么意思吗,你在哪里买的?hashmap键是beaconXInfoHashMap的mac地址。当我把beaconXInfo的mac地址放在beaconXInfoHashMap@AliOk中时,我得到了它,我会把它发送给@alit这是个好主意。但是每次扫描,我都会用另一个hashmp得到重复的mac地址,那么你的想法在那里有效吗@NPINTI正在以beacxonhashmap的形式获取BeacxInFoHashMap数据:{F5:5E:B1:65:94:4B=BeacxInfo{name='BeaconX',mac='F5:5E:B1:65:94:4B'},55:46:4F:D2:5A=BeacxInfo{name='UFO',mac='55:46:4F:D2:72:5A'},C8:DE:45:50:02=BeacxInfo{name='null',mac='C8:DE:FE:45:50:02'}。如何从mac}获取该值?–@g、 梵天达塔:你可以坚持这一套。我不知道你是如何实现整个过程的,所以你可以将它保存在内存中或保存到文件中。我得到了我一直在等待@npinti的数据。谢谢你宝贵的建议,这是个好主意。但是每次扫描,我都会用另一个hashmp得到重复的mac地址,那么你的想法在那里有效吗@NPINTI正在以beacxonhashmap的形式获取BeacxInFoHashMap数据:{F5:5E:B1:65:94:4B=BeacxInfo{name='BeaconX',mac='F5:5E:B1:65:94:4B'},55:46:4F:D2:5A=BeacxInfo{name='UFO',mac='55:46:4F:D2:72:5A'},C8:DE:45:50:02=BeacxInfo{name='null',mac='C8:DE:FE:45:50:02'}。如何从mac}获取该值?–@g、 梵天达塔:你可以坚持这一套。我不知道你是如何实现整个过程的,所以你可以将它保存在内存中或保存到文件中。我得到了我一直在等待@npinti的数据。谢谢你的宝贵建议