私は、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();
}
}
、その後onMapReady
でnew AsynchronouslyDoSomeStuff().execute();
を呼んだが、私が言ったようにそれは動作しません。
注:Thread.wait(some time);
のようなものを使用したくないのは、後で別の顧客にかかる時間がわからないからです。
'downloadCustomersData()'が同期している場合に限り、あなたが投稿したコードは必要なものを正確に行います。非同期の場合、 'onPostExecute'が呼び出される前に完了しません。それは本当にすべてが 'downloadCustomersData'が何をしているかにかかっています。 – Kuffs
@Kuffsメインスレッドで同期ネットワーク操作を実行することはできません。これは 'NetworkOnMainThreadException'につながります。 – F43nd1r
これはAsyncTaskであり、メインスレッドではないため、ネットワーク操作は同期と非同期の両方で許可されます。 – Kuffs