仅当Android中的hashmap数据发生更改时,仅将数据发送到服务器



我从过去一周开始研究这种逻辑,但没有运气。谁能帮我吗?因此,我被卡住的问题是,我正在使用Beacon Concept(Moko Beacon(使用BindService在该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;
        }
    });
    }

问题在于updatedEvices((方法,在我销毁该应用程序之前,我会连续获得值。日志值如下:

E/beaconXinfo: [BeaconXInfo{name='BeaconX', mac='F5:5E:B1:65:94:4B'}]
E/beaconXinfo: [BeaconXInfo{name='BeaconX', mac='F5:5E:B1:65:94:4B'}, BeaconXInfo{name='UFO', mac='55:46:4F:D2:72:5A'}]
E/beaconXinfo: [BeaconXInfo{name='BeaconX', mac='F5:5E:B1:65:94:4B'}, BeaconXInfo{name='UFO', mac='55:46:4F:D2:72:5A'}, BeaconXInfo{name='null', mac='C8:DE:FE:45:50:02'}] //change in the data

您可以在上面看到的上面的数据发生变化,我只想在哈希玛普中的数据更改时将数据发送到服务器。

因此,首先我发送数据" F5:5E:B1:65:94:4B",因为只有一个值。接下来,我需要将此哈希图与下一个哈希图进行比较,在该哈希图中发生了更改,称为" 55:46:4f:d2:72:5a"。我需要发送此数据,忽略" F5:5E:B1:65:94:4B"。

就像一样,如何仅发送此" C8:de:fe:45:50:02"的值与先前的哈希图进行比较到服务器。

因此,如何将Hashmap数据的第一个日志与下一个sershmap数据进行比较,我只能获取最新值并将其发送到服务器。

在发布以下内容之前,我已经研究了很多问题:

如何从Android中的ArrayList中删除重复值

如何从arraylist中删除重复的元素?

从java中的哈希玛普中删除重复值

也许我可能会与上述我在代码中使用的内容相混淆。

如果需要将任何内容添加到代码中,请在下面评论。任何建议和答案都将不胜感激。预先感谢。

最简单的方法是首先拆分您的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();
}

最新更新