これは、スレッドについて私をいつも少し混乱させてきたものです。
LocationManager を使用して Android デバイスの現在の場所を見つけるスレッドがあります。次に、UI を更新してその場所を表示します。
実際、場所を取得するために LocationFinder というクラス全体を作成しました。そう言えば
String yourLocation = (new LocationFinder).getLocation();
ただし、LocationFinder の getLocation() メソッドは別のスレッドで実行されます。だから一概には言えない
String yourLocation = (new LocationFinder).getLocation();
場所を見つけるのに数分の一秒かかるため、返される即時値は確かに場所ではないためです。内部メソッドが戻り値を実際の位置に設定するまで、getLocation() はデフォルトで「notset」を返します。
とにかく、私はこれにアプローチする方法に困惑しています。アプリが数ミリ秒間ロックされるのは非常に煩わしいので、場所が見つかるまでブロックしたくありません。AsyncTask は、getLocation() を呼び出すときに既に使用されているため、使用したくありません。AsyncTaskをネストするのは間違いだと思います。
この階層の疑似コードは次のとおりです。
public class MainActivity extends Activity {
Button locationButton = new Button(locationButtonClickListener);
LocationFinder locationFinder = new LocationFinder();
OnClickListener locationButtonClickListener = new OnClickListener() {
locationButton.setText(locationFinder.getLocation());
}
}
public class LocationFinder {
String city = "notYetSet";
public String getLastLocation() {
(new LastKnownLocationFinder).execute();
return city;
}
public String getGPSLocation() {
(new GPSLocationFinder).execute();
return city;
}
private class LastKnownLocationFinder extends AsyncTask {
protected String doInBackground {
city = [lots of code to get last known location];
}
}
private class GPSLocationFinder extends AsyncTask {
protected String doInBackground {
city = [lots of code to get location using GPS];
}
}
}
うまくいけば、それは私が得ていることを示しています。
ありがとうございました。