我是android的新手,请耐心等待。
我有一个TimerTask,我在服务中定义了run()。在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);
当调用.start时,requestLocationUpdates()失败
答案 0 :(得分:4)
您需要在具有looper的线程内调用requestLocationUpdates,即最好是主线程。 (requestLocationUpdates本身很快,不会阻塞,所以这样做没有羞耻感。)
如果您的应用程序的编写方式无法阻止您这样做,则可以使用处理程序。 文档中有一个示例,应该完全符合您的需求:http://developer.android.com/resources/articles/timed-ui-updates.html
或者,您可以使用此指令创建Runnable并在其上调用Activity.runOnUiThread()
。
答案 1 :(得分:1)
我经历过类似的情况,我无法收到位置更新,将LocationListener与我自己的Threads(使用Looper)/ HandlerThreads混合在一起。解决方案是使用PendingIntent和requestLocationUpdates(provider,minTime,minDistance,intent)。看看:How to receive location updates without using a service