1

Мое приложение-андроид извлекает некоторые данные 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, но я не знаю окончательной рекомендации. Благодарю.

+1

В соответствии с моим мнением Go with 'AsyncTask'. 'AsyncTask' лучше всего в вашем случае. –

+0

@ m-d спасибо большое – JackAW

+0

Но я не могу закрыть вопрос. Асинхронность должна запускаться из основного потока. Таймер запускается в отдельном потоке. Поэтому я не могу быть уверен, что мой метод onPostExecute будет выполнен правильно. – JackAW

ответ

0

Наконец-то я решил свою проблему. В то же время я переписал часть своей программы, чтобы использовать ScheduledThreadPoolExecutor с подклассом Runnable (вместо Asynctask). Кроме того, я добавил метод onResume(), где я перезапускаю ScheduledThreadPoolExecutor, используя: mScheduledThreadPoolExecutor.scheduleAtFixedRate(runnable, 0, interval, TimeUnit.MILLISECONDS);