Join FlipAndroid.COM Telegram Group: https://t.me/joinchat/F_aqThGkhwcLzmI49vKAiw


No se puede llamar a runOnUiThread en un subproceso desde dentro de un servicio

Quería hacer un servicio que verifique mi SMS cada 20 segundos si hay algún SMS no leído y luego enviarlo a mi sitio web a continuación, marque como leído para publicar datos en el sitio web que utilicé asynctask y funcionó bien cuando lo intenté manualmente Botón haga clic en tipo de aplicación), pero en servicio lateral no puedo definir

runOnUiThread(new Runnable() { @Override public void run() { new MyAsyncTask().execute(sender,time,message);} }); 

Es incapaz de identificar y me pide que defina runOnUiThread ¿Hay alguna manera de llamar a mi asynctask desde el lugar en el que estoy llamando por debajo de código

 public class TestService extends Service { String sender = null; String time = null; String message = null; @Override public IBinder onBind(Intent intent) { // TODO: Return the communication channel to the service. throw new UnsupportedOperationException("Not yet implemented"); } @Override public void onCreate() { Toast.makeText(getApplicationContext(), "Service Created", 1).show(); super.onCreate(); } @Override public void onDestroy() { Toast.makeText(getApplicationContext(), "Service Destroy", 1).show(); super.onDestroy(); } @Override public int onStartCommand(Intent intent, int flags, int startId) { Toast.makeText(getApplicationContext(), "Service Running ", 1).show(); new Thread(new Runnable() { public void run() { ContentValues values = new ContentValues(); Uri mSmsinboxQueryUri = Uri.parse("content://sms/inbox"); String[] columns = new String[] { "_id", "thread_id", "address", "person", "date", "body", "type" }; Cursor cursor1 = getContentResolver().query(mSmsinboxQueryUri, null, "read=0", null, null); DateFormat formatter = new SimpleDateFormat( "dd/MM/yyyy hh:mm:ss.SSS"); Calendar calendar = Calendar.getInstance(); if (cursor1.getCount() > 0) { cursor1.moveToFirst(); do { // Retrieving sender number sender = (cursor1.getString(cursor1 .getColumnIndex(columns[2])).toString()); // Retriving time of reception long ms = cursor1.getLong(cursor1 .getColumnIndex(columns[4])); calendar.setTimeInMillis(ms); time = formatter.format(calendar.getTime()).toString(); // Retriving the message body message = (cursor1.getString(cursor1 .getColumnIndex(columns[5])).toString()); runOnUiThread(new Runnable() { @Override public void run() { new MyAsyncTask() .execute(sender, time, message); } }); } while (cursor1.moveToNext());// end of while }// end of if // set as read values.put("read", true); getContentResolver().update(Uri.parse("content://sms/inbox"), values, null, null); } }).start(); return super.onStartCommand(intent, flags, startId); } private class MyAsyncTask extends AsyncTask<String, Integer, Double> { @Override protected Double doInBackground(String... params) { postData(params[0], params[1], params[2]); return null; } protected void onPostExecute(Double result) { // pb.setVisibility(View.GONE); Toast.makeText(getApplicationContext(), "command sent", Toast.LENGTH_LONG).show(); } protected void onProgressUpdate(Integer... progress) { // pb.setProgress(progress[0]); } public void postData(String sender, String time, String message) { // Create a new HttpClient and Post Header HttpClient httpclient = new DefaultHttpClient(); HttpPost httppost = new HttpPost( "http://www.mysite.co.nf/reciever.php"); try { // Add your data List<NameValuePair> nameValuePairs = new ArrayList<NameValuePair>(); nameValuePairs.add(new BasicNameValuePair("sender", sender)); nameValuePairs.add(new BasicNameValuePair("time", time)); nameValuePairs.add(new BasicNameValuePair("message", message)); httppost.setEntity(new UrlEncodedFormEntity(nameValuePairs)); // Execute HTTP Post Request HttpResponse response = httpclient.execute(httppost); } catch (ClientProtocolException e) {} catch (IOException e) {} } } } 

  • La notificación push funciona incorrectamente cuando la aplicación está en segundo plano o no se está ejecutando
  • El servicio de Android se detiene al salir de la aplicación
  • Llamar el método de clase de actividad de la clase de servicio
  • ¿Cómo establecer una comunicación bidireccional entre Actividad y Servicio en diferentes procesos?
  • Inicie Android Service cada 5 minutos
  • ¿Cómo puedo mantener mi servicio Android funcionando cuando la pantalla está apagada?
  • Cómo implementar un FileObserver desde un servicio de Android
  • Servicio de grabación / procesamiento de llamadas! - Android
  • One Solution collect form web for “No se puede llamar a runOnUiThread en un subproceso desde dentro de un servicio”

    Service no tiene un método llamado runOnUiThread() . Está asumiendo que el método de Activity también está definido para un Service , pero no lo es.

    Solución, sólo definir un método que hace exactamente eso. He aquí un ejemplo simplificado, el resto de su código permanecerá sin cambios.

     import android.os.Handler; public class TestService extends Service { Handler handler; @Override public void onCreate() { // Handler will get associated with the current thread, // which is the main thread. handler = new Handler(); super.onCreate(); } private void runOnUiThread(Runnable runnable) { handler.post(runnable); } } 

    Para obtener más información, consulte los documentos para Handler . Se utiliza para descargar un trabajo en un hilo específico. En este caso, el Handler se asocia con el subproceso de interfaz de usuario, ya que el subproceso de interfaz de usuario siempre llama a Service.onCreate() .

    FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.