这一直让我对线程感到有些困惑。
我有一个线程使用 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];
}
}
}
希望这能说明我的意思。
谢谢你。