0

AsyncTask(HttpUrlConnection)からの入力を受け取り、別のAsyncTask(HttpUrlConnection)を開始するコードを書いています。この情報を使ってGoogleマップにマーカーを追加します。AsyncTaskの完了とマップのロードを待つ

私が直面している問題は、onPostExecuteでマーカーを追加しようとしたときにマップがロードされていないことです。しかし、onMapReadyを使用しようとすると、データはまだダウンロードされていません。

マーカーを配置しようとする前にデータが読み込まれ、マップが準備完了するのを待つ方法はありますか?

+0

onFinishedメソッドでカスタムリスナー(インターフェイス)を使用し、postExecuteでそれを呼び出します。あなたは2つのasynksを行う必要があるので、2回する必要があります(または同じdoInBackgroundで両方のリクエストを実行してください) – user6547359

+0

"step completion"ごとにフラグを設定するか、[Future](https:// developer .android.com/reference/java/util/concurrent/Future.html) – Bonatti

+0

@Bonattiどうしたらいいですか? –

答えて

2

SyncEの質問は非常に一般的で、何のカスタムコードを提供していない、私は "一般的な解決策" 掲載します:それは設定ExampleOperation 2、のため

boolean isStep1Done = false; 
boolean isStep2Done = false; 

private class ExampleOperation extends AsyncTask<String, Void, String> { 

    @Override 
    protected String doInBackground(String... params) { 
     Thread.sleep(1000); 
     return "Completed"; 
    } 

    @Override 
    protected void onPostExecute(String result) { 
     isStep1Done = true; 
     continueLogic(); 
    } 

    @Override 
    protected void onPreExecute() {} 

    @Override 
    protected void onProgressUpdate(Void... values) {} 
} 

同じことをisStep2Doneをtrueに設定します。 次に、それらがシーケンシャルである場合、独立している場合は、それぞれcontinueLogic()と呼びます。この機能の最初のステップでは、すべてのフラグをチェックします。

private void continueLogic(){ 
    if(isStep1Done && isStep2Done){ 
     stuffs... 
    } 
} 
0

何の問題の使用は2つのブール値であり、データのロードが行われたときに、マップのロードが行われたときにtrueにそれらを設定し、この非同期タスクのそれぞれの両方の真その後、マーカーを追加起動するかどうかをチェック追加)

+0

それは一度だけチェックすることを意味しないでしょうし、それが本当でないならば、ステップを一切スキップします。 –

+0

問題は2回チェックし、それぞれの非同期タスクは、タスク1が最初に終了し、次に2番目のデータを埋める場合、2番目が最初に終了する場合は、終了時に最初のデータをすべて埋める) –

0

あなたは試すことができます次の論理。

public class MyAct extends Activity implements OnMapReadyCallback { 
 

 
    private GoogleMap mMap; 
 
    private List<YourObj> mItems; 
 
    
 
    public void onMapReady(GoogleMap googleMap) { 
 
    mMap = googleMap; 
 
    populateMap(); 
 
    } 
 
    
 
    private class MyTask extends AsyncTask { 
 
    ... 
 
    protected void onPostExecute(List<YourObj> results) { 
 
     mItems = results; 
 
     populateMap(); 
 
    } 
 
    } 
 

 
    private void populateMap() { 
 
    if (mMap != null && mItems != null) { 
 
     for (YourObj o : mItems) { 
 
     mMap.addMarker(...); 
 
     } 
 
    } 
 
    } 
 
    
 
}

関連する問題