获取无法在未调用Looper.prepare()的线程内创建处理程序

时间:2013-04-28 10:39:48

标签: android

我在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;
        }

1 个答案:

答案 0 :(得分:1)

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

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

您的ScheduledExecutorService未在主线程上运行。

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

所以将回调或UI代码放在runOnUiThread()块中...这将确保您在启动时处于UI线程,并在完成时在UI线程上。


有其他选择,例如使用ASyncTaskIntentService,但以上是问题的本质。