0

我在 android 中创建了一个服务,它每 3 秒将 GPS 坐标发送到远程 mysql 数据库。

但是我使用 ScheduledExecutorService 进行了 3 秒循环,但是当我单击开始按钮启动服务时,我得到了 java.lang.RuntimeException: Can't create handler inside thread that has not called Looper.prepare()

 @Override
        public int onStartCommand(Intent intent, int flags, int startId)
        {
            Toast.makeText(this, "Application Started!!!...", Toast.LENGTH_LONG).show();
            ScheduledExecutorService scheduleTaskExecutor = Executors.newScheduledThreadPool(5);

            // This schedule a runnable task every 2 minutes
            scheduleTaskExecutor.scheduleAtFixedRate(new Runnable() {
              public void run() {
                updateLatLong();
              }
            }, 0, 3, TimeUnit.SECONDS);
            return START_STICKY;
        }
4

1 回答 1

1

据我记得,此错误与您尝试从错误线程访问 Handler 的方式有关。

请记住,您的Service.onStartCommand()方法在主线程上运行。

ScheduledExecutorService没有在主线程上运行。

根据updateLatLong()方法的作用,您需要在主线程上运行其中的一部分 - 我猜您可能会进行一些 UI 更改,或者可能从该方法对服务或活动进行回调。

因此,将回调或 UI 代码放在一个runOnUiThread()块中......这将确保您在启动时位于 UI 线程上,并在完成时位于 UI 线程上。


有替代方案,例如使用ASyncTaskor anIntentService但以上是问题的本质。

于 2013-04-28T10:57:30.853 回答