我在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;
}
答案 0 :(得分:1)
据我记忆,此错误与您尝试从错误的线程访问Handler的方式有关。
请记住,您的Service.onStartCommand()
方法正在主线程上运行。
您的ScheduledExecutorService
未在主线程上运行。
根据updateLatLong()
方法的作用,您需要在主线程上运行其中的一部分 - 我猜测您可能会进行一些UI更改,或者可能会对服务进行回调或该方法的活动。
所以将回调或UI代码放在runOnUiThread()
块中...这将确保您在启动时处于UI线程,并在完成时在UI线程上。
有其他选择,例如使用ASyncTask
或IntentService
,但以上是问题的本质。