Est-il possible d'utiliser AsyncTask dans une classe de Service?
Tout est dans le titre.
Sur les documentations officielles, il est indiqué que Note that services, like other application objects, run in the main thread of their hosting process
et AsyncTask ne fonctionne que si elle est exécutée dans l'UIThread.
Ainsi est-il possible d'utiliser AsyncTask dans une classe de Service?
Je suis en train de le faire, mais je suis toujours la même erreur
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()
Je fais quelque chose de mal ou est-ce tout simplement impossible ?
Voici le code de ma classe de Service
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()", "");
}
}
}
Vous devez vous connecter pour publier un commentaire.
Veillez également à vérifier IntentService. Si cette classe est suffisant pour vos besoins, il prendra soin de beaucoup de petits détails impliqués dans la réalisation de ce modèle fonctionne correctement.
Je Crois que j'ai trouvé pourquoi il ne fonctionne pas dans mon cas.
Ici, je suis en utilisant ceci :
J'utilise cela pour faire ce que appelé CIB, Inter Processus Communication, donc je suppose que mon Service et mon Activité dans deux styles différents processus, AsyncTask doit être exécutée dans l'INTERFACE utilisateur principale de fil en fonction de l'android doc, alors pourquoi j'ai essayé de faire me semble juste impossible d'après ces faits.
Si je me trompe s'il vous plaît quelqu'un peut me corriger.
Peut-être que le problème n'est pas AsyncTask mais quelque chose d'autre. Par exemple, êtes-vous sûr que votre méthode onBind fonctionne correctement? Veuillez essayer ceci:
Vous pouvez également essayer que
Oui. Voir Reto Meier (2010) Professionnel Android 2 Le Développement De L'Application, Wrox. Meier a publié code de prise en charge (voir le Chapitre 9 du Tremblement de terre 4/src/com/paad/earthquake/EarthquakeService.java):
Sur un côté, je ne trouve aucun élément de preuve à l'appui de votre demande que "AsyncTask ne fonctionne que si elle est exécutée dans l'UIThread" (bien que ce ne violer les règles de filetage).
Bien qu'il est possible de utiliser
AsyncTask
àService
de la classe, cela viole filetage règles, en particulier,AsyncTask
doit être instancié et appelée par le thread d'INTERFACE utilisateur. (Voir https://stackoverflow.com/a/25172977/3664487 pour plus de détails).