我希望每隔10秒将一些数据和坐标一起发送到远程服务器。我想,最好的匹配是
public void onCreate( Bundle savedInstanceState ) {
//snip
locationManager.requestLocationUpdates( LocationManager.GPS_PROVIDER, 10000, 0, new SendingLocationListener() );
}
在监听器中我有以下代码:
public void onLocationChanged( Location location ) {
if( null == location ) return;
TrackerNotifierTask task = new TrackerNotifierTask();
task.execute( location );
}
TrackerNotifierTask
在其httpclient
方法中使用doInBackground()
,因此非常简单。
现在,如果我开始活动,我可以看到执行onLocationChanged()
并且数据成功点击远程服务器。但只有一次!无论我以后做什么,改变坐标或任何东西,任务都不会被调用。
这是在android中实现此类功能的正确方法还是应该使用某些background-service
?
答案 0 :(得分:3)
来自Shrikant的链接给了我一些关于LocationListener
实现的类结构的提示。
不一定要将类定义为inner anonymous class
。我将它定义为内部,但命名为one,它也起作用。
诀窍是,必须将侦听器实例声明为字段:
private LocationListener listener;
@Override
public void onCreate( Bundle savedInstanceState ) {
//snip
locationManager = (LocationManager)this.getSystemService( Context.LOCATION_SERVICE );
listener = new MyLocationListener( SomeActivity.this );
locationManager.requestLocationUpdates( provider, 1000, 0, listener );
}
否则它将在第一次运行后被垃圾收集,如果定义如下:
locationManager.requestLocationUpdates( provider, 1000, 0, new MyLocationListener() );
这是解决方案的一半。另一部分 - 关于minTime - 仍然没有得到解决。也许它与模拟器有关...我会在找到方法后立即发布缺失的部分。
更新: 似乎,在真实设备上,minInterval似乎会导致听众发射,无论是否改变了坐标
答案 1 :(得分:0)
请参阅this。
当LocationListener
作为anonymous class
实施时,它按预期工作。
答案 2 :(得分:0)
我有类似的问题, 当我使用
private LocationListener mLocationListener1 = new LocationListener() {
@Override
public void onLocationChanged(Location location) {
}
}
在我班上,
onLocationChanged仅被调用一次,
但在我将“最终”添加到之后
private final LocationListener mLocationListener1 = new LocationListener() {
问题已解决。 (就我而言,由地面服务人员使用)
好像是
如果未使用final关键字定义变量,
叫了一次之后
它会被垃圾收集,不会再被调用...