为什么在线程中使用looper

时间:2014-07-05 11:24:31

标签: android

我找到了这些代码的一部分,它使用一个服务来注册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(); 
}

2 个答案:

答案 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方法完成时结束,但在这种情况下会发生什么?我想它需要一直运行,以便位置监听器可以监听更改吗?

是的,此线程将一直执行,或者您通过终止服务手动停止。

通常我们使用这些类型的线程来提高程序的响应能力,因此主程序可以执行其他任务而不是等待位置服务。