1

したがって、私のプログラムには、2 つのタブを含む TabActivity があります。1 つのタブは ListView で、もう 1 つは Intent を介して開始される MapActivity です。私のアプリでやりたいことは、電話の場所と製品の名前を含むクエリを送信し、この製品を持っている最寄りのショップのリストを取得し、それらのショップをマップタブに表示し、それらのリストを別のタブに表示することです. アプリは、TabActivity が開始されると場所のリッスンを開始し、サーバーとの通信 (AsyncTask 内) は場所が取得されるとすぐに開始されます。

問題は、TabActivity が開始すると、最初のタブにあるため MapActivity も開始し、MapActivity はマップにオーバーレイを追加しようとし始めますが、TabActivity の AsyncTask が終了していないため、これらのオーバーレイのデータがまだないことです。サーバーからデータをまだ取得していないため、プログラムがクラッシュします。

TabActivity が最初に開かれたときにアプリで空の Google マップを表示し、サーバーからデータが取得されるのを待ってから、マップにオーバーレイを追加してショップをマークする必要があります。どうすればこれを達成できるか教えてもらえますか? MapActivity の onCreate からコードのオーバーレイ作成部分を削除し、別の場所に配置する必要があると思いますが、どこにあるのかわかりません。

4

3 に答える 3

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は、ブロードキャストがアプリケーションのサンドボックスを超えて、実際に1人の受信者だけがそれと関係を望んでいる場合でも、意図をリッスンしているデバイス上のすべての人に通知しようとすることです。

于 2011-06-03T16:31:52.557 に答える
1

AsyncTaskで、onPostExecuteメソッドをオーバーライドし、そこにオーバーレイを作成します。この関数は、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 に答える
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"));

そして最後に、AsyncTask の TabActivity onPostExecute メソッドで、必要なデータがサーバーから取得されたことを伝えるブロードキャストを送信しました。

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