我正在开发一个应用程序,该应用程序连接到服务器下载位置数据,以便在地图(谷歌地图)中添加一些标记。
我的问题是,地图是在我下载数据之前设置的,所以它完全是空的(没有标记)。
数据下载是由AsyncTask在另一个线程中执行的,我不知道在收集完所有数据后如何设置映射。
一些代码,以防万一它有帮助:
HttpGetWorker.java(负责获取数据):
...
@Override
protected String doInBackground(String... urls) {
try {
return process(urls[0]); //Private method to get data
} catch (IOException ioe) {
Log.e("HttpGetWorker:", ioe.getLocalizedMessage(), ioe);
return "Unable to retrieve web page. URL may be invalid.";
}
}
@Override
protected void onPostExecute(String result) {
for(AsyncTaskListener<String> listener : listeners) {
/**
* Activities which need the server data have to be listeners
* of this task. this processResult method comes from an own
* interface(AsyncTaskListener) and it is implemented in my "main"
* activity (see below)
*/
listener.processResult(result);
}
progressDialog.dismiss(); //just a progress dialog set in onPreExecute method
}
...
然后这个任务的监听器,我的"主要"活动MapsActivity.java:
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_maps);
initData(); //Here it is where I get the server Data, complete method below
setUpMapIfNeeded(); // These method set up my map, but before my data is retrieved,
mMap.setOnMarkerClickListener(this);
PreferenceManager.setDefaultValues(this, R.xml.preferences, false);
}
private void initData() {
/**
* This HttpDispatcher just creates an instance of the previous
* HttpGetWorker with its execute() to download the data. The "this"
* argument is refered to the current activity to register it in my
* listeners list, as said before
*/
HttpDispatcher dispatcher = new HttpDispatcher(this);
dispatcher.doGet(this);
}
...
// Interface method, here my net data is process
@Override
public void processResult(String result) {
//stuff to process the result, it does it well, but too late.
}
希望我能解释清楚。
谢谢大家!
编辑:关于具体的问题,有时最简单的解决方案是最难看到的。。。或者当我发布这篇文章时,我的脑子一团糟。我只是将addMarkers()方法更改为我的proccessResult(Strings),在所有数据都被提取后。。。
无论如何,我认为这个问题本身对其他人来说可能很有趣(AsyncTask和调用它的任何其他活动之间的同步)。所以我把它放在这里。
干杯!
在AsyncTask
完成之前不要设置标记。当task
完成时,从onPostExecute()
设置标记。