Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/ms-access/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android:如何等到LocationService设置了GlobalVars后才能获取位置_Android_Android Service_Android Location - Fatal编程技术网

Android:如何等到LocationService设置了GlobalVars后才能获取位置

Android:如何等到LocationService设置了GlobalVars后才能获取位置,android,android-service,android-location,Android,Android Service,Android Location,我有一个LocationService类扩展服务实现LocationListener,每当通过onLocationChanged方法获得新位置时,它都会不断更新全局变量 在启动程序活动的onCreate方法中,我启动此服务。接下来我要做的是调用一个web服务,它从全局变量中获取纬度和经度 这在location全局变量上给了我一个NullPointerException,我假设它是空的,因为服务运行在一个单独的线程上,并且还没有获得位置 问题:如何使其仅在从服务类获取位置时调用web服务 非常感谢

我有一个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
    }
}