暂停直到变量发生变化

问题描述:

我有一个问题:如何暂停某个活动直到某个变量被更改?暂停直到变量发生变化

我已经写了2班,一个是LocationListener的,一个是创建这个LocationListener的类的实例:

第一类:

LocationGetter locgetter = new LocationGetter(); 
LocationManager locmanag = (LocationManager)getSystemService(Context.LOCATION_SERVICE); 
locmanag.requestLocationUpdates(LocationManager.GPS_PROVIDER, 0, 0, locgetter); 
mLat = locgetter.getLat(); 
mLong = locgetter.getLon(); 

的LocationListener的类:

public class LocationGetter implements LocationListener { 

double mLat = 0.0; 
double mLong = 0.0; 

@Override 
public void onLocationChanged(Location location) { 
if(location != null){ 
    mLat = location.getLatitude(); 
    mLong = location.getLongitude(); 
} 

现在,我希望第一个类中的代码暂停,直到getLatitude和getLongitude getters实际上返回的值不是0为止。有一个原因,我没有想要在获取经度和纬度之前继续,如果此功能有效,我会显示一个进度条。我知道onLocationChanged方法只会在有位置时运行,但第一个类将继续执行。

我对Android真的很陌生,所以如果我忽略了一些很明显的东西,请原谅我。

+0

我不认为“停顿”是一个正确的词在这种情况下使用...是的,你可以使用ProgressBar,这是什么错? – 2012-03-17 15:20:32

我会建议使用某种形式的同步,如java.util.concurrent.CyclicBarrier。在Thread-1中调用CyclicBarrier#await(),然后它将等待,直到您还在Thread-2中调用它

如果您是多线程,那么等待是一个不错的选择,因为它与notify()和notifyAll()很好地配合使用。

http://docs.oracle.com/javase/1.4.2/docs/api/java/lang/Object.html#wait()

那么你可以做

while (value == 0.0) { 
    // do nothing 
} 
// now use value 

但是这是一个非常糟糕的主意。你会得到“应用程序没有响应”。另外 你不能暂停你的活动,永远不会 - 而且没有必要。

你应该做的是添加一种方法来通知你的代码,一旦它们改变就想使用这些值。 LocationListeners最简单的方法是直接在Activity中实现它们。像这样:

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的甚至是不可能的,如果你试图从你的活动UI线程,因为你更新的UI线程是被你的等待阻止。所以你永远不会得到更新。