Обновить Hashmap в фоновой службе

У меня есть фоновая служба для отслеживания местоположения пользователей. В сервисе у меня есть хэш-карта с целочисленным ключом и значением LatLng. Сервис сравнивает местоположение пользователя со значениями LatLng. Моя проблема в том, что иногда мне нужно добавить другое значение в хэш-карту.

Я пробовал 2 вещи.

  1. Я использую https://github.com/orhanobut/hawk для хранилища sharedpref, где я храню эту хэш-карту. Когда хэш-карта обновляется, я сохраняю ее в Hawk, а затем при изменении местоположения пользователя я получаю хэш-карту из хранилища Hawk. Проблема в том, что он возвращает хэш-карту без нового значения. Единственный раз, когда он действительно дает хэш-карту с обновленным значением, - это если я перезапускаю приложение.
  2. Я делаю хэш-карту статической глобальной переменной в Службе, чтобы я мог просто обновить ее в службе в любое время, когда мне нужно. В этом случае хэш-карта вообще не обновляется.

Итак, как мне лучше всего обновить хэш-карту в моем сервисе?

ИЗМЕНИТЬ Вот мой сервисный код -

public class LocationService extends Service {
private static final String TAG = "LOCATIONTEST";
private LocationManager mLocationManager = null;
private static final int LOCATION_INTERVAL = 1000;
private static final float LOCATION_DISTANCE = 10f;
public static HashMap<Integer, LatLng> mLocationList;

private class LocationListener implements android.location.LocationListener
{
    Location mLastLocation;

    public LocationListener(String provider)
    {
        Log.e(TAG, "LocationListener " + provider);
        mLastLocation = new Location(provider);
    }

    @Override
    public void onLocationChanged(Location location) {
        Log.e(TAG, "onLocationChanged: " + location);
        mLastLocation.set(location);
        // DO stuff here with update mLocationList HashMap

        // This should be the update list
        mLocationList = Hawk.get("LocationHashmap");

    }

    @Override
    public void onProviderDisabled(String provider)
    {
        Log.e(TAG, "onProviderDisabled: " + provider);
    }

    @Override
    public void onProviderEnabled(String provider)
    {
        Log.e(TAG, "onProviderEnabled: " + provider);
    }

    @Override
    public void onStatusChanged(String provider, int status, Bundle extras) {
        Log.e(TAG, "onStatusChanged: " + provider);
    }
}

LocationListener[] mLocationListeners = new LocationListener[] {
        new LocationListener(LocationManager.GPS_PROVIDER),
        new LocationListener(LocationManager.NETWORK_PROVIDER)
};

@Override
public IBinder onBind(Intent arg0)
{
    return null;
}

@Override
public int onStartCommand(Intent intent, int flags, int startId)
{
    Log.e(TAG, "onStartCommand");
    return START_STICKY;
}

@Override
public void onCreate()
{
    Log.e(TAG, "onCreate");
    mLocationList =Hawk.get("LocationHashmap", new HashMap<Integer, LatLng>());
    initializeLocationManager();
    try {
        mLocationManager.requestLocationUpdates(
                LocationManager.NETWORK_PROVIDER, LOCATION_INTERVAL, LOCATION_DISTANCE,
                mLocationListeners[1]);
    } catch (java.lang.SecurityException ex) {
        Log.i(TAG, "fail to request location update, ignore", ex);
    } catch (IllegalArgumentException ex) {
        Log.d(TAG, "network provider does not exist, " + ex.getMessage());
    }
    try {
        mLocationManager.requestLocationUpdates(
                LocationManager.GPS_PROVIDER, LOCATION_INTERVAL, LOCATION_DISTANCE,
                mLocationListeners[0]);
    } catch (java.lang.SecurityException ex) {
        Log.i(TAG, "fail to request location update, ignore", ex);
    } catch (IllegalArgumentException ex) {
        Log.d(TAG, "gps provider does not exist " + ex.getMessage());
    }
}

@Override
public void onDestroy()
{
    Log.e(TAG, "onDestroy");
    super.onDestroy();
    if (mLocationManager != null) {
        for (int i = 0; i < mLocationListeners.length; i++) {
            try {
                mLocationManager.removeUpdates(mLocationListeners[i]);
            } catch (Exception ex) {
                Log.i(TAG, "fail to remove location listners, ignore", ex);
            }
        }
    }
}

private void initializeLocationManager() {
    Log.e(TAG, "initializeLocationManager");
    if (mLocationManager == null) {
        mLocationManager = (LocationManager) getApplicationContext().getSystemService(Context.LOCATION_SERVICE);
    }
}


}

В другом фрагменте список обновляется, сначала извлекая его из локального хранилища, затем обновляя список, а затем сохраняя его снова.

    HashMap<Integer, LatLng> locationList = Hawk.get("LocationList");
    locationList.put(order.getId(), latLng);
    Hawk.put("LocationList", locationList;

Теперь, когда вызывается OnLocationChanged, я пытаюсь вызвать Hawk.get ("LocationList"), чтобы получить обновленную хеш-карту, но она не обновляется. Я думаю, что с библиотекой что-то не так, но я не знаю, что еще делать. Я также пробовал сделать список в сервисе статическим и просто обновить этот список. Таким образом, вместо приведенного выше кода во фрагменте он будет выглядеть так:

LocationService.mLocationList.put(order.getId(), latLng)

Но опять же список не обновляется.

В OnCreate я получаю HashMap из локального хранилища. Скажем, размер списка равен 2. В другом месте приложения я обновляю этот список, теперь размер списка равен 3. Теперь, когда служба обращается к onLocationChanged, я хочу перебрать все значения в хэш-карте. Но если бы я попытался получить то же самое из локального хранилища, чтобы получить обновленную хэш-карту, размер все равно будет 2. Как я могу обновить эту хеш-карту в сервисе?

«иногда мне нужно добавить другое значение в хэш-карту» - я не уверен, что могу понять, не могли бы вы уточнить? Также расскажите о двух вещах, которые вы пробовали, например какой-то код. Я не знаю Hawk, и я не эксперт по Android, но я мог бы хотя бы попытаться прокомментировать вариант 2. Кстати, статические глобальные переменные намекают на некоторую ошибку, вы можете подумать о более подходящем хранилище, таком как redis / memcached или база данных (я не знаю, должны ли значения быть постоянными).

Thomas 30.10.2018 18:16

Есть ли в Android JDK ConcurrentHashMap? Если да, вы можете использовать это

Ivan 30.10.2018 18:20

Разместите свой код, относящийся к присвоению значений и хранению / восстановлению вашей карты.

PM 77-1 30.10.2018 18:20

Где именно вы помещаете ключи и ценности в HashMap?

Darwind 31.10.2018 20:24

@Darwind в моем фрагменте пользовательского интерфейса

kkl260 31.10.2018 20:30

Хорошо, как спрашивает @ PM77-1, добавьте соответствующий код, в котором вы сохраняете / восстанавливаете свою карту.

Darwind 31.10.2018 20:32

@Darwind Я получаю хэш-карту из локального хранилища, обновляю ее и снова сохраняю. Затем каждый раз, когда вызывается onLocationChanged, я вызываю Hawk.get («LocationHashmap»), чтобы получить обновленную хеш-карту. Но хэш-карта не обновляется, пока я не перезапущу приложение. Я также пробовал сделать хэш-карту статической и просто обновить ее таким образом. Я отредактирую свой вопрос, чтобы показать часть этого кода.

kkl260 02.11.2018 04:40
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
0
7
130
0

Другие вопросы по теме