我找到了这些代码的一部分,它使用一个服务来注册LocationListener(lm),它将监听位置的变化。
在onStart中创建一个新线程,因为另一种方式是服务将在主线程中运行。
但是我不明白为什么我需要在这个帖子中使用一个looper?另外,我需要以某种方式阻止它吗?
直到这个线程何时运行?我知道通常情况下,一个线程在其run方法完成后结束,但在这种情况下会发生什么?我想它需要一直运行,以便位置监听器可以监听更改吗?
onStart(Intent intent, intstartId)
{
super.onStart(intent, startId);
triggerService = new Thread(new Runnable()
{
public void run()
{
try
{
Looper.prepare();
lm = (LocationManager) getSystemService(Context.LOCATION_SERVICE);
myLocationListener= new GPSListener(); long minTime= 10000;
float minDistance= 50;
lm.requestLocationUpdates(LocationManager.GPS_PROVIDER, minTime, minDistance, myLocationListener);
Looper.loop();
}
catch(Exception e)
{
Log.e("MYGPS", e.getMessage() );
}
}
});
triggerService.start();
}
答案 0 :(得分:0)
Loopr.prepare()为线程分配消息循环。一旦你有了消息循环,你就可以
使用命令将请求推入(由指定的线程激活)
handler.post()。
但是...
为什么你想要使用工作线程,有或没有msg循环
为了请求位置更新?
Android位置通知API是一个旨在实现的异步API 通过UI线程激活。正确Android的许多方面 开发将要求您生成线程。不是这个。
作为旁注,您的代码告诉我您正在寻找50米的位置粒度。
如果是这种情况,请考虑使用新的fused location provider。
使用优先级设置为PRIORITY_BALANCED_POWER_ACCURACY的融合提供程序 给你一个40米误差范围的SLA,每小时电池消耗约0.6%。办法 比使用GPS便宜..
答案 1 :(得分:0)
但是我不明白为什么我需要在这个帖子中使用一个looper?另外,我是否需要以某种方式阻止它?
由于您的听众将被激活或在每个long minTime= 10000;
如果此时间已过,并且在float minDistance= 50;
和minDistance上移动了对象
当发生这种情况时,听众会完成他的工作并更新位置。
lm.requestLocationUpdates(LocationManager.GPS_PROVIDER,minTime,minDistance,myLocationListener);
之后必须返回并设置当前位置并再次等待事件发生。
我是否需要以某种方式阻止它?
您无需停止它。
直到这个线程何时运行?
此线程将一直执行,直到您终止或退出位置服务。
线程在其run方法完成时结束,但在这种情况下会发生什么?我想它需要一直运行,以便位置监听器可以监听更改吗?
是的,此线程将一直执行,或者您通过终止服务手动停止。
通常我们使用这些类型的线程来提高程序的响应能力,因此主程序可以执行其他任务而不是等待位置服务。