线程内的处理程序运行

6

我是新手安卓开发者,请多关照。

我有一个TimerTask,我在Service中定义了run()。在run()内部,我调用了

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

它抱怨无法创建处理程序,因为我认为它是一个后台线程。我该如何解决?

编辑:代码片段

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()会失败。


你是怎么解决这个问题的?我也遇到了同样的问题(在定时器内访问GPS)。 - stackoverflowuser2010
1个回答

4
您需要在带有循环器的线程中调用requestLocationUpdates,最好是主线程。(requestLocationUpdates本身很快并且不会阻塞,所以这样做没有问题)。
如果您的应用程序以某种方式使您无法这样做,则可以使用Handler。文档中有一个示例,应该正是您所需的:http://developer.android.com/resources/articles/timed-ui-updates.html 或者,您可以创建一个包含此指令的Runnable,并在其上调用Activity.runOnUiThread()。

1
我无法在主线程中运行它,因为它必须是TimerTask(即线程)的一部分。当我将其包围在Looper.prepare(); requestLocationUpdates(); Looper.loop(); 中时,它会在最后一个语句处冻结。对于您的替代解决方案,由于这是服务而不是UI线程,因此不能使用Activity。有其他替代方案吗? - Taranfx
你在哪个线程中创建了Handler?你能发一下更多的代码和错误信息吗? - EboMike

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接