Android: отображение полученных данных из службы переднего плана на MapView внутри действия - PullRequest
1 голос
/ 01 мая 2020

Я реализовал foreground service для предоставления мне текущего местоположения каждые 10 секунд. С собранными данными я хочу отобразить маршрут на карте.

Однако при работе с отслеживанием местоположения и услугами экран телефона не всегда будет включен из-за экономии заряда аккумулятора. Таким образом, действие вызовет методы onPause(), onStop(), и самая ранняя точка для обновления MapView будет после onResume(). До этого момента в каждой трансляции на активность я отправляю список всех LatLng объектов, очищаю маршрут до этого момента и снова отображаю маршрут, используя Polyline

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

Альтернатива будет при каждой трансляции сохранять полученные объекты LatLng в списке, подобном List<LatLng> points=new ArrayList<LatLng>();, инициализированному в упражнении, и для отображения данных вычислять разницу между полученными координатами и теми, кто уже сохранен в Список действий, и отображать только те, которые Polyline.

Что вы думаете? Есть ли лучший подход, чем эти два?

Ответы [ 2 ]

0 голосов
/ 01 мая 2020

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

Сервис переднего плана каждые 10 секунд будет дорогостоящим в отношении процессора и батареи. С учетом вышесказанного, есть несколько способов, которыми вы можете go обойти это:

// Store data in somekind of database
1- SQLite (On the phone not recommended as writing and reading database values can take alot of time and be resource-extensive)
2- Firebase(Remote best option)
3- SharedPrefernces(On the phone but single key-value pairs works for your case )

Учебное пособие по Firebase: https://www.androidauthority.com/create-a-gps-tracking-application-with-firebase-realtime-databse-844343/

//To minimize resource usages instead of a foreground service consider but try to increase your time between requests.
1-AlarmManger
2-setWindow
3-setExact

Наконец, пожалуйста, не удаляйте старую polyline и создайте новую, так как графика - враг памяти и батареи. просто сделайте что-то вроде:

LatLng somePoint = new LatLng(location.getLatitude(), location.getLongitude());

//Then add this point to the existing `polyline`:

List<LatLng> fullPointList = somePolyLine.getPoints();
fullPointList.add(somePoint);
somePolyLine.setPoints(fullPointList);
0 голосов
/ 01 мая 2020

Установите уникальный идентификатор для вашего текущего маршрута. Когда служба работает, сохраните точки в БД. Затем передайте свое событие (может быть с вашим текущим идентификатором маршрута) и загрузите их отдельно от вашей активности, чтобы получить очки.

...