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 スレッドにいることが保証されます。


ASyncTaskまたはを使用するなどの代替手段がありますIntentServiceが、上記が問題の本質です。

于 2013-04-28T10:57:30.853 に答える