2010-08-22 106 views
5

我是android新手,忍受着我。线程运行中的处理程序

我有一个TimerTask,我在其中定义run()。在内部运行(),我打电话

locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 
    LOCATION_UPDATES_MIN_TIME_MS, LOCATION_UPDATES_MIN_DISTANCE_M, gpsListener); 

它抱怨说无法创建Handler,因为我相信它的后台线程。我如何解决它?

编辑:代码片断

locationTask = new TimerTask() { 

     @Override 
     public void run() { 
      Log.d(Commands.TAG, "Running location Task"); 
      myLocationProvider = new MyLocationProvider(locationManager, handler, MyService.this); 
      myLocationProvider.start(); 
      myLocationProvider.stop(); 
     } 
    }; 

,后来它的计划如下:

locationTimer = new Timer(); 
    locationTimer.schedule(locationTask, 10000, cmds.getAlertInterval()*60); 

当。开始叫,requestLocationUpdates()失败

+0

你的解决方案是什么?我有同样的问题(从定时器内部访问GPS)。 – stackoverflowuser2010 2012-07-12 03:55:24

回答

4

您需要调用requestLocationUpdates从一个线程内的活套,即最好是主线程。 (requestLocationUpdates本身很快并且不会阻塞,所以这样做并不可耻)。

如果您的应用程序的写入方式妨碍了您的操作,则可以使用处理程序。 文档有这应该是非常正是你需要的一个例子:http://developer.android.com/resources/articles/timed-ui-updates.html

或者,你可以创建一个Runnable使用此指令就可以拨打Activity.runOnUiThread()

+1

我不能从主线程运行它,因为它必须是TimerTask(这是一个线程)的一部分,并且当我用 包围它时Looper.prepare(); requestLocationUpdates(); Looper.loop(); 它会冻结在最后的声明 对于您的替代解决方案,活动不能使用,因为这是一个服务,而不是一个UI线程。 任何替代品? – Taranfx 2010-08-23 03:22:14

+0

你在什么线程中创建了Handler?你能否发布更多的代码和错误消息? – EboMike 2010-08-23 06:07:34

1

我遇到过类似的情况,我无法通过自己的线程(使用Looper)/ HandlerThreads来混合LocationListener的位置更新。解决方案是使用PendingIntent和requestLocationUpdates(provider,minTime,minDistance,intent)。看看:How to receive location updates without using a service