所以,在我的程序中,我有一个包含两个选项卡的TabActivity,一个选项卡是ListView,另一个是通过Intent启动的MapActivity。我想让我的应用程序做的是发送一个带有电话位置和产品名称的查询,并查看具有该产品的最近商店列表,然后在地图选项卡中显示这些商店并在另一个选项卡中显示它们的列表。当TabActivity启动时,应用程序开始侦听位置,并且一旦获得位置,就会启动与服务器的通信(在AsyncTask中)。
问题是当TabActivity启动时,它也会启动MapActivity,因为它位于第一个选项卡中,并且MapActivity开始尝试在地图上添加叠加层,但是这些叠加层还没有数据,因为AsyncTask in TabActivity尚未从服务器获取数据,这会导致程序崩溃。
首次打开TabActivity时,我需要我的应用程序显示空谷歌地图,并等待从服务器获取数据,然后在地图上添加叠加层以标记其上的商店。任何人都可以告诉我如何实现这一目标?我想我应该从MapActivity中的onCreate中删除Overlay制作代码的一部分并将其放在其他地方,但我不知道在哪里。
答案 0 :(得分:1)
在AsyncTask中,覆盖onPostExecute方法并在其中进行覆盖。一旦doInBackground方法完成,将调用此函数。您很可能希望将doInBackground内容的结果提供给onPostExecute。
来自here的示例:
private class DownloadImageTask extends AsyncTask {
protected Bitmap doInBackground(String... urls) {
return loadImageFromNetwork(urls[0]);
}
protected void onPostExecute(Bitmap result) {
mImageView.setImageBitmap(result);
}
}
答案 1 :(得分: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
解决方案的问题在于广播超出了应用程序的沙箱,尝试通知设备上正在侦听您的意图的任何人,即使只有一个接收者实际上想要与之相关。
答案 2 :(得分:0)
我自己解决了这个问题。它非常简单,只需要使用广播接收器。
我在MapActivity中创建了一个BroadcastReceiver:
private BroadcastReceiver myReceiver = new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
addMarkers();
mapView.invalidate();
}
};
然后我在MapActivities onCreate方法中注册了它:
registerReceiver(myReceiver, new IntentFilter("VAISTINES.RECEIVED"));
最后我在TabActivity onPostExecute方法中创建了我的AsyncTask,发送广播告知已从服务器检索到所需的数据:
Intent i = new Intent("VAISTINES.RECEIVED");
sendBroadcast(i);