【问题标题】:Send Data to Server only if there is a change in HashMap Data in Android仅当 Android 中的 HashMap 数据发生变化时才向服务器发送数据
【发布时间】:2019-09-30 03:51:23
【问题描述】:

上周我一直在研究这个逻辑,但没有运气。任何人都可以帮助我吗?所以我被卡住的问题是我正在使用信标概念(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;
        }
    });
    }

问题在于 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

正如你在上面看到的,最后一个日志中的数据发生了变化,我只想在 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 比较发送到服务器。

那么如何将第一个哈希图数据日志与下一系列哈希图数据进行比较,我只能获取最新值并将其发送到服务器。

在发布之前,我已经研究了一堆问题,如下所示:

How to remove Duplicate value from arraylist in Android

How do I remove repeated elements from ArrayList?

Remove duplicate values from HashMap in Java

也许我可能对我在代码中使用的上述内容感到困惑。

如果需要在代码中添加任何内容,请在下方评论。任何建议和答案将不胜感激。提前致谢。

【问题讨论】:

  • beaconXInfos 似乎没有在onScanDevice 方法中更新。

标签: java android hashmap beacon


【解决方案1】:

您为什么不每次扫描设备时检查它是否存在然后发送它?

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();
}

【讨论】:

  • 您好,感谢您的快速回复。我会试试看 。非常感谢@Ali
  • 我将 beaconXInfoHashMap 数据作为 beacxonhashmap:{F5:5E:B1:65:94:4B=BeaconXInfo{name='BeaconX', mac='F5:5E:B1:65:94 :4B'}, 55:46:4F:D2:72:5A=BeaconXInfo{name='UFO', mac='55:46:4F:D2:72:5A'}, C8:DE:FE:45: 50:02=BeaconXInfo{name='null', mac='C8:DE:FE:45:50:02'}}.如何从中获取mac值?
  • 我不明白,你从哪里得到的?在您的情况下,hashmap 键是 beaconXInfoHashMap 的 mac 地址。
  • 当我将 beaconXInfo 的 mac 地址放入 beaconXInfoHashMap @Ali 时,我得到了这个信息
  • 好的,我会发给@Ali
【解决方案2】:

最简单的方法是首先拆分您的beaconXinfo。不知道怎么做,但你可以反序列化它,或者使用正则表达式来分解它们并提取 MAC 地址。

一旦您有了 MAC 地址列表(或迭代它们的方法),就可以使用 HashSet,它公开了一个名为 contains 的方法,它允许您检查一个字符串是否已经存在于该集中。

如果集合中不存在该字符串,则表示这是新内容,您需要将其发送到服务器。如果存在,则表示你已经看到了该字符串,无需发送。

【讨论】:

  • 这是个好主意。但是对于每次扫描,我都会使用另一个 hashmp 获得重复的 mac 地址,所以你的想法在那里有效吗? @npinti
  • 我将 beaconXInfoHashMap 数据作为 beacxonhashmap:{F5:5E:B1:65:94:4B=BeaconXInfo{name='BeaconX', mac='F5:5E:B1:65:94 :4B'}, 55:46:4F:D2:72:5A=BeaconXInfo{name='UFO', mac='55:46:4F:D2:72:5A'}, C8:DE:FE:45: 50:02=BeaconXInfo{name='null', mac='C8:DE:FE:45:50:02'}}。如何从中获取mac值? ——
  • @g.brahma Datta:你可以持久化 Set。我不知道您是如何实现整个事情的,因此您可以将其保存在内存中或将其保存到文件中。
  • 我得到了我在等待@npinti 的数据。感谢您的宝贵建议
猜你喜欢
  • 2023-03-25
  • 2020-01-20
  • 1970-01-01
  • 2021-09-08
  • 2010-12-03
  • 2018-07-16
相关资源
最近更新 更多