我有一种方法可以下载一些数据,包括来自API的位置坐标并填充数组。我在onCreate
中调用此方法然后在onMapReady
中调用另一种将标记放在地图上的方法。我现在只有2个测试项目可以添加到我的地图中,所以它不需要花费太多时间来下载和显示,但是在我下载数据之前有时它仍会运行后面的方法。所以它没有标记。
我尝试了不同的方法,比如AsyncTask,但是这个方法总是在第一个方法完成之前运行。
这是我的代码
private class AsynchronouslyDoSomeStuff extends AsyncTask<Void, Void, Void>{
@Override
protected Void doInBackground(Void... params) {
Log.v("Donkey", "Async doInBackground Called");
downloadCustomersData();
return null;
}
@Override
protected void onPostExecute(Void aVoid) {
super.onPostExecute(aVoid);
Log.v("Donkey", "Async onPostExecute Called");
updateMapMarkers();
}
}
然后在new AsynchronouslyDoSomeStuff().execute();
中调用onMapReady
,但正如我所说它不起作用。
注意:我不想使用Thread.wait(some time);
之类的内容,因为我不知道以后会为不同的客户花多少时间。
答案 0 :(得分:0)
继上面的评论之后。我更容易(在我看来)做这种事情的方法是EventBus模型。
请参阅:http://greenrobot.org/eventbus/
使用此功能,您只需在想要更新UI时触发事件即可。
答案 1 :(得分:0)
您要做的是在完成两个异步任务(onMapReady
和doInBackground
)后立即调用方法。
最简单的方法是存储首先完成的任务的结果,然后在第二个完成时执行该方法。
e.g。
if(customerData == null) {
this.googleMap = googleMap;
} else {
setMapMarkers(customerData, googleMap);
}
if(googleMap == null) {
this.customerData = customerData;
} else {
setMapMarkers(customerData, googleMap);
}
答案 2 :(得分:0)
所以我通过将第二种方法作为第一种方法的回调函数来解决我的问题。
然后在我的地图的onLocationChanged中调用第一个方法。
我在for循环之后立即调用了第二种方法。