Intereting Posts
Андроид – GC_FOR_ALLOC освобожден 6346K, 7% бесплатно, приостановлено 143ms, всего 143ms Ошибка компиляции исходного кода Android: «Попробуйте увеличить размер кучи с помощью опции java» -Xmx <size> » Является ли объединение для небольших объектов более эффективным, чем сборщик мусора Java от Java? Создание базового PSD для разработки пользовательского интерфейса Android App для устройства mdpi, 320 / 480px Android, как запуститьOnUiThread в другом классе? Являются ли глубокие знания Java необходимым для Android? Извлеките массив из parse.com и добавьте значения в локальный массив (Android) Как я могу захватить весь вид в растровое изображение при использовании пешеходного перехода для отображения веб-страницы? XMPP, WebSocket и другие вопросы Связывание сторонних libs (libs.a) с NDK Есть ли полезный учебник по анимации для начинающих? Как поймать ошибку «Растровое изображение слишком велико для загрузки в текстуру» SetCanceledOnTouchOutside не работает, когда я нажимаю рядом с диалогом снаружи Исключение исключенного аргумента для Android Как найти ближайший полицейский участок в точке геометрии

Невозможно создать обработчик внутри потока, который не вызвал Looper.prepare () в CountDownTimer

У меня есть услуга. И есть метод, называемый onServiceUpdate (). Этот метод аналогичен onLocationChanged () в API Карт Google.

Поэтому я хочу запустить CountDownTimer внутри метода onServiceUpdate (), но показывая такую ​​ошибку:

Can't create handler inside thread that has not called Looper.prepare() java.lang.RuntimeException: Can't create handler inside thread that has not called Looper.prepare() at android.os.Handler.<init>(Handler.java:200) at android.os.Handler.<init>(Handler.java:114) at android.os.CountDownTimer$1.<init>(CountDownTimer.java:114) at android.os.CountDownTimer.<init>(CountDownTimer.java:114) at skripsi.ubm.studenttracking.Service2$6.<init>(Service2.java:317) at skripsi.ubm.studenttracking.Service2.onServiceUpdate(Service2.java:317) 

Это мой код:

  @Override public void onServiceUpdate(ServiceState state) { final float[] distance = new float[2]; Location.distanceBetween(state.getGeoPoint().getLatitude(), state.getGeoPoint().getLongitude(), 6.130607787619352,106.81839518499267, distance); if (distance[0] > 25.0) { CountDownTimer cdt5 = new CountDownTimer(total_onServiceUpdate,1000) { @Override public void onTick(long millisUntilFinished) { total_onServiceUpdate = millisUntilFinished/1000; } @Override public void onFinish() { sendSMS(); stopSelf(); } }.start(); } 

Solutions Collecting From Web of "Невозможно создать обработчик внутри потока, который не вызвал Looper.prepare () в CountDownTimer"

OnServiceUpdate () – это асинхронная задача, которая запускает и уведомляет вас, следовательно, представляет собой фоновый поток. Все, что вам нужно сделать, это вызвать timer.start (); Из основного потока, Служба фактически работает на главной теме, это намерение, которое не так, ваше решение идет по пути

 new Handler(Looper.getMainLooper()).post(new Runnable() { @Override public void run() { CountDownTimer cdt5 = new CountDownTimer(total_onServiceUpdate,1000) { @Override public void onTick(long millisUntilFinished) { total_onServiceUpdate = millisUntilFinished/1000; } @Override public void onFinish() { sendSMS(); stopSelf(); } }.start(); } }); 

Теперь вы можете продолжить сэр. Всегда коллирует коды флиртовать с экраном на главном Looper

Надеюсь, поможет

Я думаю, проблема заключается в том, что в вашей sendSMS () вы пытаетесь сделать что-то, что требует UIThread (например, обновление представления). Попробуй это:

 Handler mHandler = new Handler() { public void handleMessage(Message msg){ sendSMS(); }}; 

Измените метод onFinish на

 @Override public void onFinish() { mHandler.sendEmptyMessage(0); stopSelf(); } 

Вы не можете обновлять действие gui из службы через обработчик, потому что обработчик должен быть создан в потоке gui.

Вместо этого вы должны отправить широковещательную передачу из своей службы и реализовать локальный широковещательный приемник в той деятельности, которая получает эту трансляцию

Android:

Попробуйте это до вызова обработчика

If (Looper.MyLooper () == null) {Looper.Prepare (); }