2012-12-08 35 views
1

我有一个LocationService类(扩展实现LocationListener),当通过onLocationChanged方法获得新位置时,它会不断更新全局变量。Android:如何等待LocationService在获取位置之前设置GlobalVars

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

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

问题:我如何使它只在从服务类中获取位置时才会调用Web服务?

非常感谢。 :)

+0

你为什么不打电话给你的网站你的'LocationService'的'onLocationChanged'方法中的服务操作?如果它是一个冗长的操作,你总是可以把它包装在'AsyncTask'中。 – Akdeniz

+0

hmmm因为LocationService仅用于通过GlobalVars跟踪用户的当前位置。然后,我将调用不同的Web服务,具体取决于用户所在的屏幕,并从GlobalVars的最新位置发送。 – chongzixin

+0

因此,如何在每个活动开始时将处理Web服务操作的监听器注册到'LocationService'。 – Akdeniz

回答

0

YourService当位置改变时通知每个注册的LocationOperatorLocationOperator是一个简单的界面,声明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 
    } 
} 
+0

哇谢谢代码!我真的从中学到了一些东西。我曾经想象过,当活动被破坏时,我应该从阵列列表中移除侦听器?但是,如果我不想在每次更改自己的位置时都打电话给我的Web服务,则此功能将无法工作。我更希望随后刷新我的数据,只有当用户点击刷新。这就是为什么我打算使用LocationService来更改GlobalVars,以便每次刷新时都会包含最新的位置信息。 – chongzixin

0

我认为这是不好的等待它(取决于浪费时间),因为该活动不能启动,但你可以用这个简单的代码尝试:

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

但我的建议是尝试检查它与其他AsyncTask不要做一个积极的等待。希望它可以帮助你。

+0

'虽然(纬度== null);'一直在疯狂地旋转,并不是一个好主意 – zapl

+0

是的,我说这是一个积极的等待,只有在你能够快速获得信息的情况下才能使用。 –

+0

是的,我试着运行一个while循环来等待,但它很像处理很长一段时间,没有发生任何事情。也许在while循环中LocationService线程更新位置永远不会运行? – chongzixin