Android, je peux mettre AsyncTask dans une catégorie distincte et un rappel?
Je suis en train d'apprendre des AsyncTask et vous voulez l'utiliser comme une catégorie distincte, plutôt que d'une sous-classe.
Par exemple,
class inetloader extends AsyncTask<String, Void, String> {
@Override
protected String doInBackground(String... urls) {
String response = "";
DefaultHttpClient client = new DefaultHttpClient();
HttpGet httpGet = new HttpGet(urls[0]);
try {
HttpResponse execute = client.execute(httpGet);
InputStream content = execute.getEntity().getContent();
BufferedReader buffer = new BufferedReader(
new InputStreamReader(content));
String s = "";
while ((s = buffer.readLine()) != null) {
response += s;
}
} catch (Exception e) {
e.printStackTrace();
}
return response;
}
@Override
protected void onPostExecute(String result) {
Log.e("xx",result);
//how do I pass this result back to the thread, that created me?
}
}
et le principal(ui) filetage:
inetloader il = new inetloader();
il.execute("http://www.google.com");
//il.onResult()
//{
///do something...
//}
Merci!
- Oui, vous pouvez le mettre dans une catégorie distincte, mais la plupart des gens ne le font pas car son but est généralement beaucoup plus clair si c'est un intérieur de classe. Si vous allez pour les réutiliser dans de nombreuses activités, aller de l'avant.
- J'ai l'intention de l'utiliser à des fins différentes, comme si je l'appeler à partir d'ici, sur le résultat, il faut le faire et que, si je l'appelle à partir de là, sur le résultat, il devrait faire autre chose... à cet effet si je vais le garder dans la même classe et de l'avoir appeler une fonction de la classe que sur le résultat, je vais devoir faire une nouvelle AsyncTask pour chaque type d'action qu'il a à faire onresult...
- utilisation de l'interface, juste en œuvre de votre activité par une interface et dans onPostExcute() de Asyn appel de classe mContext.implementedMethod().
- L'avoir dans une classe séparée aide aussi avec le contrôle de version & de la gestion du changement.
- BTW pls commencer vos noms de classe avec une lettre majuscule, par exemple "InetLoader" - tout de base Java convention.
Vous devez vous connecter pour publier un commentaire.
Utilisation d'une interface. Quelque chose comme:
Puis le faire dans votre thread de l'INTERFACE utilisateur:
Dans inetloader, ajouter:
puis Dans postExecute(), faites:
vous pouvez passer à l'instance d'activité de constructeur et de l'activité des appels de fonction à partir de là...
Comme l'utilisation de l'interface :
Mise en œuvre dans l'Activité et passer dans le constructeur de Async tâche et de mettre à jour le résultat de
onPostExecute
à l'aide desetResult
fonction.here you get result which is in onPostExecute(String result)
AsyncTask
, à l'aide de laget()
méthode va bloquer le thread d'INTERFACE utilisateur et devient ce que devrait être une procédure asynchrone en mode synchrone un. La seule valable pour leget()
méthode que j'ai jamais trouver serait pour "chaînage" deuxAsyncTasks
.