Android:如何等到LocationService设置了GlobalVars后才能获取位置
我有一个LocationService类扩展服务实现LocationListener,每当通过onLocationChanged方法获得新位置时,它都会不断更新全局变量 在启动程序活动的onCreate方法中,我启动此服务。接下来我要做的是调用一个web服务,它从全局变量中获取纬度和经度 这在location全局变量上给了我一个NullPointerException,我假设它是空的,因为服务运行在一个单独的线程上,并且还没有获得位置 问题:如何使其仅在从服务类获取位置时调用web服务Android:如何等到LocationService设置了GlobalVars后才能获取位置,android,android-service,android-location,Android,Android Service,Android Location,我有一个LocationService类扩展服务实现LocationListener,每当通过onLocationChanged方法获得新位置时,它都会不断更新全局变量 在启动程序活动的onCreate方法中,我启动此服务。接下来我要做的是调用一个web服务,它从全局变量中获取纬度和经度 这在location全局变量上给了我一个NullPointerException,我假设它是空的,因为服务运行在一个单独的线程上,并且还没有获得位置 问题:如何使其仅在从服务类获取位置时调用web服务 非常感谢
非常感谢 我认为这并不好,因为这取决于所浪费的时间,因为活动永远无法启动,但您可以尝试使用以下简单代码:
While(latitude == null);
use latitude and longitude
continue with oncreate...
但我的建议是,试着用其他AsyncTask检查它,因为不要进行主动等待。希望对您有所帮助。当位置发生变化时,您的服务会通知每个注册的LocationOperator。OperationLocation方法声明,LocationOperator是一个简单的接口
然后您可以通过MainActivity访问此服务并注册位置
Whilelatitude==null;一直在疯狂地旋转,这不是一个好主意是的,我说过这是一个积极的等待,只有在你快速获得信息的情况下才应该使用。是的,我试着运行一个while循环来等待,但这就像处理了很长时间,什么都没有发生。也许在while循环中,更新位置的LocationService线程从未运行过?您应该在while之前启动LoactionService。如果什么也没有发生,请检查服务是否正在更改变量。为什么不在LocationService的onLocationChanged方法中调用web服务操作?如果这是一个较长的操作,您可以始终将其包装在AsyncTask.hmmm中,因为LocationService仅用于通过GlobalVars跟踪用户的当前位置。然后,我将根据用户在哪个屏幕上调用不同的web服务,并在每个活动开始时将最新位置从GlobalVarsSo发送到LocationService,如何注册一个处理web服务操作的侦听器。这听起来像是一个计划。你介意再详细一点吗?我不知道如何实现这一点。哇,谢谢你的代码!我真的从中学到了一些东西。我曾想象过,当活动被销毁时,我应该将侦听器从arraylist中删除?不过,顺便说一句,如果我不想每次正确更改位置时都调用我的web服务,那么这将不起作用。我更希望在用户点击“刷新”后,才刷新我的数据。这就是我计划使用LocationService更改GlobalVars的原因,这样每当我刷新时,它就会包含最新的位置信息。
class YourService extends Service implements LocationListener {
private List<LocationOperator> listeners = new ArrayList<LocationOperator>();
public List<LocationOperator> getListeners() {
return listeners;
}
@Override
public void onLocationChanged(Location location) {
for (LocationOperator listener : listeners) {
listener.operate(location);
}
}
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
// request location updates from `LOCATION_SERVICE`
return Service.START_NOT_STICKY;
}
//...
}
public class MainActivity extends Activity {
static YourService yourService;
@Override
protected void onCreate(Bundle savedInstanceState) {
//...
Intent service = new Intent(this, YourService.class);
startService(service);
bindService();
}
// ...
}
public class OperatorActivity extends Activity implements LocationOperator {
@Override
public void onCreate(Bundle instance) {
// ...
MainActivity.yourService.getListeners().add(this);
// ...
}
public void operate(Location location) {
// use location
}
}