1

因此,在我的程序中,我有一个包含两个选项卡的 TabActivity,一个选项卡是 ListView,另一个是通过 Intent 启动的 MapActivity。我想要我的应用程序做的是发送一个带有电话位置和产品名称的查询,并接收一个最近的拥有该产品的商店的列表,然后在地图选项卡中显示这些商店并在另一个选项卡中显示它们的列表。当 TabActivity 启动时,应用程序开始侦听位置,并在获得位置后立即开始与服务器(在 AsyncTask 中)的通信。

问题是当 TabActivity 启动时,它也启动了 MapActivity,因为它在它的第一个选项卡中,并且 MapActivity 开始尝试在地图上添加叠加层,但是这些叠加层还没有数据,因为 TabActivity 中的 AsyncTask 还没有完成尚未从服务器获取数据,这会导致程序崩溃。

我需要我的应用程序在第一次打开 TabActivity 时显示一个空的谷歌地图,并等待从服务器获取数据,然后将叠加层添加到地图上以标记其上的商店。谁能告诉我如何实现这一目标?我想我应该从 MapActivity 的 onCreate 中删除 Overlay 制作部分代码并将其放在其他地方,但我不知道在哪里。

4

3 回答 3

1

在您的 AsyncTask 中,覆盖 onPostExecute 方法并在那里制作您的 Overlay。一旦 doInBackground 方法完成,该函数将被调用。您很可能希望将 doInBackground 内容的结果提供给 onPostExecute。

这里的例子:

private class DownloadImageTask extends AsyncTask {
     protected Bitmap doInBackground(String... urls) {
         return loadImageFromNetwork(urls[0]);
     }

     protected void onPostExecute(Bitmap result) {
         mImageView.setImageBitmap(result);
     }
 }
于 2011-05-03T22:40:07.817 回答
1

一种可能更好的方法是使用ActivityGroup#getCurrentActivity()获取当前选项卡活动,检查并转换为预期的 MapActivity,然后在该活动中调用一个方法:

protected void onPostExecute(final Bitmap result) {
    final Activity activity = MyTabActivity.this.getCurrentActivity();
    if (activity instanceof MyMapActivity) {
        ((MyMapActivity) activity).onBitmapReceived(result); // or some other method, like onMarkersReceived(), etc..
    }
}

BroadcastReceiver解决方案的问题在于广播超出了您的应用程序的沙箱,试图通知设备上正在侦听您的意图的任何人,即使只有一个接收器实际上想要与它有任何关系。

于 2011-06-03T16:31:52.557 回答
0

我自己已经解决了这个问题。它真的很简单,只需要使用广播接收器。

我在 MapActivity 中创建了一个 BroadcastReceiver:

private BroadcastReceiver myReceiver = new BroadcastReceiver() {        
    @Override
    public void onReceive(Context context, Intent intent) {
        addMarkers();
        mapView.invalidate();
    }
};

然后我在 MapActivity onCreate 方法中注册了它:

registerReceiver(myReceiver, new IntentFilter("VAISTINES.RECEIVED"));

最后,我在 TabActivity 的 onPostExecute 方法中让我的 AsyncTask 发送一个广播,告知已从服务器检索到所需的数据:

Intent i = new Intent("VAISTINES.RECEIVED");
sendBroadcast(i);
于 2011-06-03T14:50:48.673 回答