Как заставить MapActivity в TabActivity ожидать получения данных оверлея с сервера? - PullRequest
1 голос
/ 04 мая 2011

Итак, в моей программе у меня есть TabActivity, которая содержит две вкладки, одна вкладка - это ListView, а другая - MapActivity, которая запускается через Intent.Я хочу, чтобы мое приложение отправляло запрос с указанием местоположения телефона и названием продукта и отображало список ближайших магазинов, у которых есть этот продукт, затем отображало эти магазины на вкладке карты и отображало их список на другой вкладке.Приложение начинает прослушивать местоположение, когда запускается TabActivity, а связь с сервером (в AsyncTask) начинается сразу после получения местоположения.

Проблема в том, что при запуске TabActivity также запускается MapActivity, поскольку онона своей первой вкладке MapActivity начинает пытаться добавить наложения на карту, но для этих наложений еще нет данных, поскольку AsyncTask в TabActivity еще не завершил получение данных с сервера, что приводит к сбою программы.

Мне нужно, чтобы мое приложение показывало пустую карту Google при первом открытии TabActivity и ждало получения данных с сервера, а затем добавляло на карту наложения, чтобы отмечать магазины на ней.Может кто-нибудь показать мне, как я могу этого достичь?Думаю, мне следует удалить часть кода, создающую наложение, из onCreate в MapActivity и поместить его куда-нибудь еще, но я не знаю, где.

Ответы [ 3 ]

1 голос
/ 03 июня 2011

Потенциально лучшим подходом было бы получить текущую активность вкладки с помощью 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 заключается в том, что широковещательная передача выходит за пределы изолированной программной среды вашего приложения, пытаясь уведомить кого-либо на устройстве, которое прослушивает ваши намерения, даже если на самом деле только один приемник хочет иметь с ним какое-либо отношение.

1 голос
/ 04 мая 2011

В вашей 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);
     }
 }
0 голосов
/ 03 июня 2011

Я решил эту проблему сам.Это действительно просто, просто нужно использовать широковещательный приемник.

Я создал BroadcastReceiver в моем MapActivity:

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

Затем я зарегистрировал его в методе MapActivities onCreate:

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

И, наконец, я заставил свой AsyncTask в методе TabActivity onPostExecute отправить сообщение о том, что необходимые данные были получены с сервера:

Intent i = new Intent("VAISTINES.RECEIVED");
sendBroadcast(i);
...