Отправлять данные на сервер только в случае изменения данных HashMap в Android - PullRequest
0 голосов
/ 13 мая 2019

Я изучал эту логику с прошлой недели, но не повезло.Кто-нибудь может мне помочь с этим?Поэтому проблема, в которой я застрял, заключается в том, что я использую концепцию маяка (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", потому что есть только одно значение.Затем мне нужно сравнить эту хеш-карту со следующей хеш-картой, в которой есть изменение в данных под названием «55: 46: 4F: D2: 72: 5A».Мне нужно отправить эти данные, игнорируя «F5: 5E: B1: 65: 94: 4B».

Как то же самое, Как отправить только это значение «C8: DE: FE: 45: 50: 02»сравнение с предыдущим хеш-картой на сервере.

Итак, как сравнить первый журнал данных хеш-карты со следующей серией данных хеш-карты, где я могу взять только последнее значение и отправить его на сервер.

Я исследовал кучу вопросов, прежде чем опубликовать это, как показано ниже:

Как удалить значение Duplicate из массива в Android

Как мнеудалить повторяющиеся элементы из ArrayList?

Удалить повторяющиеся значения из HashMap в Java

Возможно, я могу быть смущен тем, что я использую в своем коде.

Если что-то нужно добавить в код, пожалуйста, прокомментируйте ниже.Любые предложения и ответы будут высоко оценены.Заранее спасибо.

Ответы [ 2 ]

1 голос
/ 13 мая 2019

Почему бы вам, каждый раз, когда вы сканируете устройство, не проверить, существует ли оно, а затем отправить его в противном случае?

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();
}
1 голос
/ 13 мая 2019

Самый простой способ - сначала разделить ваш beaconXinfo.Не уверен, как это сделать, но вы можете либо десериализовать его, либо использовать регулярные выражения, чтобы разбить их и извлечь MAC-адрес.

После того, как у вас есть список MAC-адресов (или средство для перебораих), используйте HashSet, который предоставляет метод с именем contains, который позволяет проверить, присутствует ли уже строка в наборе.

Если строка отсутствует в наборе, то это означает, чточто это что-то новое, и вам нужно отправить его на сервер.Если он существует, то это означает, что вы уже видели эту строку и нет необходимости отправлять ее.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...