1

我有一个LocationService类(扩展Service实现LocationListener),只要通过该onLocationChanged方法获得新位置,它就会不断更新全局变量。

onCreate我的启动器活动的方法中,我启动了这个服务。接下来我要做的是调用一个从全局变量中获取纬度和经度的 Web 服务。

这给了我一个NullPointerException位置全局变量,我假设它是因为服务在单独的线程上运行并且尚未获得位置。

问题:我如何做到只有在从服务类获得位置时才调用 Web 服务?

非常感谢。:)

4

2 回答 2

0

我认为等待它不好(取决于浪费的时间),因为活动永远无法开始,但您可以尝试使用以下简单代码:

While(latitude == null);
use latitude and longitude
continue with oncreate...

但我的建议是尝试与其他 AsyncTask 一起检查它,以确保不要进行主动等待。希望它可以帮助你。

于 2012-12-08T23:59:09.937 回答
0

YourServiceLocationOperator当位置改变时通知每个注册的人。LocationOperator是一个简单的接口,声明operate(Location)方法。

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();
    }

    // ...
}

然后您就可以访问此服务MainActivity并注册Location

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
    }
} 
于 2012-12-10T21:11:54.850 回答