No se puede crear el controlador dentro de hilo que no ha llamado Looper.prepare () en CountDownTimer

Tengo un servicio. Y hay un método llamado onServiceUpdate (). Este método es similar a onLocationChanged () en la API de Google Maps.

Así que quiero iniciar CountDownTimer dentro de método onServiceUpdate (), pero mostrando un error como este:

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) 

Este es mi código:

  @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(); } 

El onServiceUpdate () es una tarea aysnchronous que se ejecuta y le notifica, por lo tanto es un hilo de fondo. Todo lo que necesitas hacer es llamar a timer.start (); Desde el hilo principal, el servicio en realidad se ejecuta en el hilo principal, es intentService que no lo hace, su solución está a lo largo de los caminos de

 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(); } }); 

Ahora puede continuar señor. Siempre llame a los códigos de la coqueta con la pantalla en el Looper principal

Espero eso ayude

Creo que el problema es que en tu sendSMS () estás intentando hacer algo que requiere UIThread (como actualizar una vista). Prueba esto:

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

Modifique el método onFinish para

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

No puede actualizar una actividad gui de un servicio a través de un controlador porque el controlador tiene que crearse en el subproceso gui.

En su lugar, tiene que enviar una emisión de su servicio e implementar un receptor de difusión local en la actividad que recibe esta transmisión

Android:

Intente esto antes de llamar a un manejador

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

  • Ejemplo de servicio bind / unbind (android)
  • MVC en Android: ¿Aplicación o servicio para actualizaciones asíncronas?
  • Cómo ensayar un servicio de Android que depende de una conexión de red
  • Error interno al utilizar Descubrimiento de servicio de red en Android
  • Conexión a un servicio web desde android - AsyncTask o Service?
  • ¿Hay una alternativa onBackPressed () para un servicio?
  • Animar ImageView dentro de WindowManager en un servicio de Android
  • Grabar sonido Y reproducir sonido modulado En Android?
  • Android - vistas de servicio
  • Android: uso de la red en un servicio
  • Android detecta el estado táctil desde cualquier aplicación
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.