2017-06-23 4 views
0

私は、APIから位置の座標を含むいくつかのデータをダウンロードし、配列を生成するメソッドを持っています。私はonCreateでこのメソッドを呼び出していますonMapReady私はマップ上にマーカーを置く別のメソッドを呼び出しています。私はマップに追加する2つのテスト項目しか持っていないので、ダウンロードして表示するのに時間がかかりませんが、データをダウンロードする前に後の方法を実行することがあります。そのため、マーカーは表示されません。メソッドが終了するまで待ってから次の行に進んでください。

私はAsyncTaskなどのさまざまなアプローチを試しましたが、最初のものが完了する前に常にこのメソッドを実行します。

は、ここに私のコード

private class AsynchronouslyDoSomeStuff extends AsyncTask<Void, Void, Void>{ 
    @Override 
    protected Void doInBackground(Void... params) { 
     Log.v("Donkey", "Async doInBackground Called"); 
     downloadCustomersData(); 
     return null; 
    } 

    @Override 
    protected void onPostExecute(Void aVoid) { 
     super.onPostExecute(aVoid); 
     Log.v("Donkey", "Async onPostExecute Called"); 
     updateMapMarkers(); 
    } 
} 

、その後onMapReadynew AsynchronouslyDoSomeStuff().execute();を呼んだが、私が言ったようにそれは動作しません。

注:Thread.wait(some time);のようなものを使用したくないのは、後で別の顧客にかかる時間がわからないからです。

+4

'downloadCustomersData()'が同期している場合に限り、あなたが投稿したコードは必要なものを正確に行います。非同期の場合、 'onPostExecute'が呼び出される前に完了しません。それは本当にすべてが 'downloadCustomersData'が何をしているかにかかっています。 – Kuffs

+0

@Kuffsメインスレッドで同期ネットワーク操作を実行することはできません。これは 'NetworkOnMainThreadException'につながります。 – F43nd1r

+1

これはAsyncTaskであり、メインスレッドではないため、ネットワーク操作は同期と非同期の両方で許可されます。 – Kuffs

答えて

0

だから私は、最初の方法のコールバック関数として第二の方法を呼び出すことで、私の質問を解決しました。

その後、私のマップのonLocationChangedで最初のメソッドを呼び出します。

私はループの直後に2番目のメソッドを呼び出しました。

0

上記のコメントに続きます。このタイプのことをやる方がずっと簡単です(私の意見では)方法はEventBusモデルです。

参照してください:あなたはあなたのUIを更新するたびhttp://greenrobot.org/eventbus/

はこれを使って、あなただけのイベントを発生することができます。

0

2つの非同期タスク(onMapReadydoInBackground)が完了するとすぐにメソッドを呼び出します。

これを行う最も簡単な方法は、最初に終了したタスクの結果を保存し、2番目のタスクが終了したらメソッドを実行することです。


if(googleMap == null) { 
    this.customerData = customerData; 
} else { 
    setMapMarkers(customerData, googleMap); 
} 
関連する問題