我尝试“不断”从Web服务加载数据。我已经构建了AsyncTaskLoader来从Web服务加载数据,它工作正常。
现在我尝试每5秒钟启动一次加载器(在上一次加载器运行完成后等待5秒)。为此,我尝试使用ScheduledExecutorService,scheduleWithFixedDelay()看起来正确用于此用例。
现在我有这样的事情:
@Override
public void onActivityCreated(Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState);
scheduleTaskExecutor= Executors.newSingleThreadScheduledExecutor();
scheduleTaskExecutor.scheduleWithFixedDelay(new Runnable() {
public void run() {
fireLoaderHandler.sendEmptyMessage(1);
}
}, 0, 5, TimeUnit.SECONDS);
}
private Handler fireLoaderHandler = new Handler() {
@Override
public void handleMessage(Message msg) {
restartLoadet();
}
};
private void restartLoadet() {
getLoaderManager().restartLoader(0, null, this).forceLoad();
}
@Override
public void onLoadFinished(Loader<List<Vehicle>> loader, List<Vehicle> data) {
for(Vehicle vehicle : data) {
Marker marker = mMarkerHashMap.get(vehicle);
if(marker == null) {
Marker m = mMap.addMarker(new MarkerOptions().position(vehicle.getLocation()).title(vehicle.getName()));
mMarkerHashMap.put(vehicle, m);
}
else
{
marker.setPosition(vehicle.getLocation());
}
}
}
这“工作”但是SchedulerExecutorService在加载程序完成并开始计算5秒延迟之前真的在等待吗?我觉得现在更像是火和忘记的东西?
总体来说,实现这个的正确方法是什么,定期激活加载器的restartLoader()?
更新
在代码示例中添加了onLoadFinished()。所以我使用loader来获取web api中的对象列表。这些对象用于绘制标记以进行映射。我还在mMarkerHashMap中存储了标记和我的车辆对象映射,因此当我在即将到来的加载器(web api)响应中获得相同的对象(具有更新的位置)时,我可以更新标记位置。