Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/370.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 仅当Android中的HashMap数据发生更改时才向服务器发送数据_Java_Android_Hashmap_Beacon - Fatal编程技术网

Java 仅当Android中的HashMap数据发生更改时才向服务器发送数据

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

过去一周我一直在研究这个逻辑,但运气不好。有人能帮我吗?所以我遇到的问题是,我使用了信标概念(Moko beacon),它使用bindService扫描信标,直到应用程序被销毁。所以我一直都能得到信标数据

这是我的密码:

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的数据。谢谢你的宝贵建议