安卓-如何将后台AsyncTask与我的主要活动同步



我正在开发一个应用程序,该应用程序连接到服务器下载位置数据,以便在地图(谷歌地图)中添加一些标记。

我的问题是,地图是在我下载数据之前设置的,所以它完全是空的(没有标记)。

数据下载是由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()设置标记。

最新更新