¿Es posible usar AsyncTask en una clase de servicio?
Todo está en el título.
En las documentaciones oficiales se indica que los Note that services, like other application objects, run in the main thread of their hosting process
y AsyncTask sólo funciona si se ejecuta en el UIThread.
- Admob: Cómo cargar AdRequest fuera de UI Thread?
- Manejar, quiero correr periódicamente
- Cómo actualizar la interfaz de usuario desde el servicio de Android utilizando RxJava / RxAndroid
- No se puede crear el controlador dentro de hilo que no ha llamado Looper.prepare ()
- Cómo saber si este hilo es un hilo de interfaz de usuario
Entonces, ¿es posible usar AsyncTask en una clase de servicio?
Estoy tratando de hacerlo, pero 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 malo o es simplemente 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()", ""); } } }
- ¿Por qué sólo el subproceso de interfaz de usuario en Android puede actualizar la interfaz de usuario?
- ¿Es apropiado SQL o acceso general a archivos en el hilo principal de la interfaz de usuario de Android?
- Android - llamando al hilo de ui del hilo de trabajo
- Cómo utilizar runOnUiThread
- ¿Qué sucede con un AsyncTask cuando la actividad de lanzamiento se detiene / destruye mientras todavía se está ejecutando?
- Android: ¿Posible que el hilo de fondo bloquee hasta que el hilo de UI finalice la operación?
- Android, creando un hilo sencillo que actualizará mi contador de segundos
- ¿OnPreExecute () y onPostExecute () se ejecutan en el subproceso de interfaz de usuario o en el subproceso desde el que se inició AsyncTask?
También asegúrese de visitar IntentService. Si esa clase es suficiente para sus necesidades, se hará cargo de un montón de pequeños detalles involucrados en hacer que el patrón de trabajo correctamente.
Creo que encontré por qué no está funcionando 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 utilizando esto para hacer lo que se llama IPC, Inter Process Communication , así que supongo que mi servicio y mi actividad están en dos procesos diferentes, AsyncTask debe ejecutarse en el hilo principal de la interfaz de usuario de acuerdo con el documento Android, así que ¿por qué estaba tratando Hacer me parece imposible de acuerdo con esos hechos.
Si estoy equivocado por favor alguien puede corregirme.
Tal vez el problema no es AsyncTask sino algo más. Por ejemplo, ¿está seguro de que su método onBind funciona correctamente? Por favor, pruebe esto:
@Override public IBinder onBind(Intent arg0) { return null; }
También puedes probar
public class NetworkService extends Service{ @Override public void onStart(Intent intent, int startId) { new ConnectTask().execute("test42"); } }
Aunque es posible utilizar AsyncTask
en una clase de Service
, esto viola las reglas de subprocesamiento , en particular, AsyncTask
debe instanciarse e invocarse en el subproceso de interfaz de usuario. (Consulte https://stackoverflow.com/a/25172977/3664487 para más información.)
¿Es posible usar AsyncTask en una clase de servicio?
Sí. Ver Reto Meier (2010) Professional Android 2 Desarrollo de aplicaciones , Wrox. Meier ha publicado un código de soporte (véase / Capítulo 9 Terremoto 4 / src / com / paad / earthquake / 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); ... } }
De un lado, no puedo encontrar ninguna evidencia para apoyar su afirmación de que " AsyncTask sólo funciona si se ejecuta en el UIThread " (aunque esto violaría las reglas de subprocesos ).
- El desplazamiento no funciona con CoordinatorLayout + imagen de paralaje + BottomSheetLayout
- ¿Cómo crear un banner de AdMm mediante programación?