2010-05-01 7 views
18

Todo está en el título.¿Es posible usar AsyncTask en una clase de servicio?

En la documentación oficial se indica que Note that services, like other application objects, run in the main thread of their hosting process y AsyncTask solo funciona si se ejecuta en UIThread.

¿Es posible utilizar AsyncTask en una clase de servicio?

estoy tratando de hacerlo pero yo siempre estoy recibiendo el mismo error

05-01 18:09:25.487: ERROR/JavaBinder(270): java.lang.ExceptionInInitializerError 

...

05-01 18:09:25.487: ERROR/JavaBinder(270): Caused by: java.lang.RuntimeException: Can't create handler inside thread that has not called Looper.prepare() 

¿Estoy haciendo algo mal o es sólo imposible?

Aquí está el código de mi clase de servicio

package com.eip.core; 

import android.app.Service; 
import android.content.Intent; 
import android.os.AsyncTask; 
import android.os.IBinder; 
import android.os.RemoteException; 
import android.util.Log; 

public class NetworkService extends Service { 


    private final INetwork.Stub mBinder = new INetwork.Stub() { 

     @Override 
     public int doConnect(String addr, int port) throws RemoteException { 
      new ConnectTask().execute("test42"); 
      return 0; 
     } 
    }; 

    @Override 
    public IBinder onBind(Intent arg0) { 
     return mBinder; 
    } 

    private class ConnectTask extends AsyncTask<String, Void, Void> { 

     @Override 
     protected void onPreExecute() { 
      super.onPreExecute(); 
      Log.i("OnPreExecute()", ""); 
     } 

     @Override 
     protected Void doInBackground(String... arg0) { 
      Log.i("doInBackground()", ""); 
      return null; 
     } 

     @Override 
     protected void onPostExecute(Void result) { 
      super.onPostExecute(result); 
      Log.i("OnPostExecute()", ""); 
     } 

    } 
} 

Respuesta

2

Creo que he encontrado por la que no está trabajando en mi caso.

Aquí estoy usando esto:

private final INetwork.Stub mBinder = new INetwork.Stub() { 

     @Override 
     public int doConnect(String addr, int port) throws RemoteException { 
      new ConnectTask().execute("test42"); 
      return 0; 
     } 
    }; 

estoy usando esto para hacer lo así llamado IPC, Proceso Inter Comunicación, así que supongo que mi servicio y mi actividad están en proceso de Dos diferentes, AsyncTask debe ejecutarse en el hilo de interfaz de usuario principal de acuerdo con el documento de android, entonces, por qué estaba tratando de hacer me parece simplemente imposible de acuerdo con esos hechos.

Si me equivoco, alguien puede corregirme.

12

También asegúrese de revisar IntentService. Si esa clase es suficiente para sus necesidades, se ocupará de muchos detalles pequeños necesarios para que ese patrón funcione correctamente.

1

Tal vez el problema no es AsyncTask sino algo más. Por ejemplo, ¿estás seguro de que tu método onBind funciona correctamente? Por favor, intente esto:

@Override 
public IBinder onBind(Intent arg0) { 
    return null; 
} 

También puede probar que

public class NetworkService extends Service{ 
    @Override 
    public void onStart(Intent intent, int startId) { 
    new ConnectTask().execute("test42"); 
    } 
} 
1

¿Es posible utilizar AsyncTask en una clase de servicio?

Sí. Ver Reto Meier (2010) Desarrollo profesional de aplicaciones para Android 2, Wrox. Meier tiene published supporting code (ver/Capítulo 9 Terremoto 4/src/com/PAAD/terremoto/EarthquakeService.java):

public class EarthquakeService extends Service {   
    ... 
    private EarthquakeLookupTask lastLookup = null; 
    ... 

    private class EarthquakeLookupTask extends AsyncTask<Void, Quake, Void> { 
     ... 
    } 

    @Override 
    public int onStartCommand(Intent intent, int flags, int startId) {  
     ... 
     refreshEarthquakes(); 
     return Service.START_NOT_STICKY; 
    }; 

    private void refreshEarthquakes() { 
     ... 
     lastLookup = new EarthquakeLookupTask(); 
     lastLookup.execute((Void[])null); 
     ... 
    } 
} 

En un aparte, no puedo encontrar ninguna evidencia para apoyar su afirmación de que "sólo funciona AsyncTask si se ejecuta en UIThread "(aunque esto sería violate threading rules).

+0

Hola, esto no viola las reglas de enhebrado ya que su servicio siempre se ejecuta en el hilo de UI hasta que no bifurca los hilos del mismo – user1530779

+0

Así que el código anterior funcionaría bien supongo que está confundido entre servicios y servicios intencionados, Intento servicios ejecutados en un hilo de fondo por defecto – user1530779

Cuestiones relacionadas