Ну, вы могли бы сделать
while (value == 0.0) {
// do nothing
}
// now use value
но это действительно плохая идея. Вы получите «Приложение не отвечает». Также
Вы не должны приостанавливать свою активность, никогда - и это не обязательно.
Что вам нужно сделать, это добавить способ уведомления вашего кода, который хочет использовать значения после их изменения.
Самый простой способ использования LocationListeners - реализовать их непосредственно в своей деятельности. вот так:
class MyActivity extends Activity implements LocationListener {
onCreate() {
locmanag.requestLocationUpdates(LocationManager.GPS_PROVIDER, 0, 0, this);
}
public void onLocationChanged(Location location) {
// now change the ui. This is called on UI thread.
}
}
Если вы хотите, чтобы местоположение обрабатывалось другим классом, вы все равно можете уведомить свою активность об изменениях.
Если вы хотите использовать LocationListener только из одного действия, которое будет работать:
class MyActivity extends Activity {
private LocationGetter mGetter;
onCreate() {
mGetter = new LocationGetter(this);
locmanag.requestLocationUpdates(LocationManager.GPS_PROVIDER, 0, 0, mGetter);
}
public void somethingHappend() {
mGetter.getLat();
}
}
public class LocationGetter implements LocationListener {
private final MyActivity mActivity;
public LocationGetter(MyActivity activity) {
mActivity= activity;
}
@Override
public void onLocationChanged(Location location) {
if(location != null){
mLat = location.getLatitude();
mLong = location.getLongitude();
if (mActivity!= null) {
mActivity.somethingHappend();
}
}
public long getLat() {
return mLat;
}
}
Если вы хотите использовать LocationListener из разных видов деятельности, вы должны реализовать общий интерфейс (как у LocationListener)
class MyActivity extends Activity implements LocationGetter.MyCallback {
private LocationGetter mGetter;
onCreate() {
mGetter = new LocationGetter(this);
locmanag.requestLocationUpdates(LocationManager.GPS_PROVIDER, 0, 0, mGetter);
}
public void somethingHappend() {
mGetter.getLat();
}
}
public class LocationGetter implements LocationListener {
public Interface MyCallback {
// you could pass lat + long here
public void somethingHappend();
}
private final MyCallback mCallback;
public LocationGetter(MyCallback callback) {
mCallback = callback;
}
@Override
public void onLocationChanged(Location location) {
if(location != null){
mLat = location.getLatitude();
mLong = location.getLongitude();
if (mCallback != null) {
mCallback.somethingHappend();
}
}
public long getLat() {
return mLat;
}
}
Вместо создания нового интерфейса обратного вызова вы также можете использовать LocationListener из всех ваших действий. Работает также, но не показывает, как работают эти обратные вызовы:)
Другая возможность заключается в использовании, например, Обработчик (особенно если другая вещь выполняется в другом потоке)
class MyActivity extends Activity implements Handler.Callback {
private Handler mHandler;
onCreate() {
mHandler = new Handler(this);
mGetter = new LocationGetter(mHandler);
locmanag.requestLocationUpdates(LocationManager.GPS_PROVIDER, 0, 0, mGetter);
}
public boolean handleMessage(Message msg) {
// msg.what would be 0, that's what we send
mGetter.getLat();
// we are in UI thread here. safe to modify.
return true;
}
}
public class LocationGetter implements LocationListener {
private final Handler mHandler;
public LocationGetter(Handler handler) {
mHandler = handler;
}
@Override
public void onLocationChanged(Location location) {
if(location != null){
mLat = location.getLatitude();
mLong = location.getLongitude();
if (mHandler != null) {
// you can send a lot more here
mHandler.sendEmptyMessage(0);
}
}
public long getLat() {
return mLat;
}
}
Кроме того, ожидание LocationListener даже невозможно, если вы попробуете это из своего потока пользовательского интерфейса, так как вы получите обновление в потоке пользовательского интерфейса, которое заблокировано вашим ожиданием. Таким образом, вы никогда не получите обновление.