У меня есть фоновая служба для отслеживания местоположения пользователей. В сервисе у меня есть хэш-карта с целочисленным ключом и значением LatLng. Сервис сравнивает местоположение пользователя со значениями LatLng. Моя проблема в том, что иногда мне нужно добавить другое значение в хэш-карту.
Я пробовал 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. Как я могу обновить эту хеш-карту в сервисе?
Есть ли в Android JDK ConcurrentHashMap
? Если да, вы можете использовать это
Разместите свой код, относящийся к присвоению значений и хранению / восстановлению вашей карты.
Где именно вы помещаете ключи и ценности в HashMap
?
@Darwind в моем фрагменте пользовательского интерфейса
Хорошо, как спрашивает @ PM77-1, добавьте соответствующий код, в котором вы сохраняете / восстанавливаете свою карту.
@Darwind Я получаю хэш-карту из локального хранилища, обновляю ее и снова сохраняю. Затем каждый раз, когда вызывается onLocationChanged, я вызываю Hawk.get («LocationHashmap»), чтобы получить обновленную хеш-карту. Но хэш-карта не обновляется, пока я не перезапущу приложение. Я также пробовал сделать хэш-карту статической и просто обновить ее таким образом. Я отредактирую свой вопрос, чтобы показать часть этого кода.
«иногда мне нужно добавить другое значение в хэш-карту» - я не уверен, что могу понять, не могли бы вы уточнить? Также расскажите о двух вещах, которые вы пробовали, например какой-то код. Я не знаю Hawk, и я не эксперт по Android, но я мог бы хотя бы попытаться прокомментировать вариант 2. Кстати, статические глобальные переменные намекают на некоторую ошибку, вы можете подумать о более подходящем хранилище, таком как redis / memcached или база данных (я не знаю, должны ли значения быть постоянными).