暂停直到变量发生变化
我有一个问题:如何暂停某个活动直到某个变量被更改?暂停直到变量发生变化
我已经写了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真的很陌生,所以如果我忽略了一些很明显的东西,请原谅我。
我会建议使用某种形式的同步,如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线程是被你的等待阻止。所以你永远不会得到更新。
我不认为“停顿”是一个正确的词在这种情况下使用...是的,你可以使用ProgressBar,这是什么错? – 2012-03-17 15:20:32