Мое приложение-андроид извлекает некоторые данные json из удаленного API для каждого маркера (маркер показывает позицию реального устройства, на котором хранится менее 10 устройств), и устанавливает статус устройства путем изменения цвета маркера в соответствии с некоторым правилом, работающим с данными json. Я использую AsyncTask для извлечения данных json и изменения состояния устройства. Я продолжаю получать данные в ConcurrentHashMap<Device, Data>
. Итак, я запускаю несколько асинктов, по одному для каждого устройства. Я также использую пользовательское информационное окно (на самом деле пользовательский InfoWindowAdapter), чтобы показать некоторые данные об устройстве. Сначала я рисую маркеры и держу их на карте HashMap<Device, Marker>
. Я исполняю asynctasks один за другим с помощью:AsyncTask refreshing google map api v2
new MyAsyncTask(markerMap).execute(device)
Мой обычай InfoWindowAdapter переопределяет метод getInfoContents, где некоторые собранные данные asynctasks используются для показа в InfoWindow, при нажатии. Все работает нормально. Но теперь я хочу обновлять свои маркеры каждые 10 секунд. Я пытался это сделать, используя следующий подход:
Timer timer = new Timer();
timer.scheduleAtFixedRate(new TimerTask(){
@Override
public void run() {
new MyAsyncTask(markerMap).executeOnExecutor(AsyncTask.SERIAL_EXECUTOR, device1);
new MyAsyncTask(markerMap).executeOnExecutor(AsyncTask.SERIAL_EXECUTOR, device2);
}}, 0, 10000);
Мой вопрос, если это правильный/лучший способ освежить мою карту? Или я должен использовать Runnable вместо AsyncTask, а в Runnable отправить сообщение обработчику при извлечении json-данных для обновления Marker? Еще один вопрос: следует ли использовать Timer или ScheduledExecutorService? Я прочитал несколько обсуждений в StackOverflow, но я не знаю окончательной рекомендации. Благодарю.
В соответствии с моим мнением Go with 'AsyncTask'. 'AsyncTask' лучше всего в вашем случае. –
@ m-d спасибо большое – JackAW
Но я не могу закрыть вопрос. Асинхронность должна запускаться из основного потока. Таймер запускается в отдельном потоке. Поэтому я не могу быть уверен, что мой метод onPostExecute будет выполнен правильно. – JackAW