我的Android应用程序从地图上出现的每个标记(标记显示真实设备的位置,要监视的设备少于10个)中从远程API检索一些json数据,并通过更改设置来设置设备的状态根据处理给定json数据的某些规则的标记的颜色。我使用AsyncTask来获取json数据并更改设备的状态。我在ConcurrentHashMap<Device, Data>
中保留了数据。所以,我运行了一些asynctasks,每个设备一个。我还使用自定义信息窗口(实际上是自定义InfoWindowAdapter)来显示有关设备的更多数据。首先,我绘制一个标记,并将它们保存在地图HashMap<Device, Marker>
中。我使用:
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,并且在获取json数据以更新Marker时,在Runnable中向Handler发送消息?还有一个问题:我应该使用Timer还是ScheduledExecutorService?我已经阅读了一些StackOverflow讨论,但我不知道最终的建议。感谢。
答案 0 :(得分:0)
最后我解决了我的问题。与此同时,我重写了部分程序,以便将ScheduledThreadPoolExecutor
与子类Runnable
(而不是Asynctask
)一起使用。另外我添加了onResume()方法,我使用ScheduledThreadPoolExecutor
重新启动mScheduledThreadPoolExecutor.scheduleAtFixedRate(runnable, 0, interval, TimeUnit.MILLISECONDS);