J'ai ces deux cours. Ma principale activité et celui qui prolonge la AsyncTask
, maintenant dans mon activité principale je dois obtenir le résultat de l' OnPostExecute()
en AsyncTask
. Comment passer ou obtenir le résultat de mon activité principale?
Voici les exemples de codes.
Mon activité principale.
public class MainActivity extends Activity{
AasyncTask asyncTask = new AasyncTask();
@Override
public void onCreate(Bundle aBundle) {
super.onCreate(aBundle);
//Calling the AsyncTask class to start to execute.
asyncTask.execute(a.targetServer);
//Creating a TextView.
TextView displayUI = asyncTask.dataDisplay;
displayUI = new TextView(this);
this.setContentView(tTextView);
}
}
Ceci est la classe AsyncTask
public class AasyncTask extends AsyncTask<String, Void, String> {
TextView dataDisplay; //store the data
String soapAction = "http://sample.com"; //SOAPAction header line.
String targetServer = "https://sampletargeturl.com"; //Target Server.
//SOAP Request.
String soapRequest = "<sample XML request>";
@Override
protected String doInBackground(String... string) {
String responseStorage = null; //storage of the response
try {
//Uses URL and HttpURLConnection for server connection.
URL targetURL = new URL(targetServer);
HttpURLConnection httpCon = (HttpURLConnection) targetURL.openConnection();
httpCon.setDoOutput(true);
httpCon.setDoInput(true);
httpCon.setUseCaches(false);
httpCon.setChunkedStreamingMode(0);
//properties of SOAPAction header
httpCon.addRequestProperty("SOAPAction", soapAction);
httpCon.addRequestProperty("Content-Type", "text/xml; charset=utf-8");
httpCon.addRequestProperty("Content-Length", "" + soapRequest.length());
httpCon.setRequestMethod(HttpPost.METHOD_NAME);
//sending request to the server.
OutputStream outputStream = httpCon.getOutputStream();
Writer writer = new OutputStreamWriter(outputStream);
writer.write(soapRequest);
writer.flush();
writer.close();
//getting the response from the server
InputStream inputStream = httpCon.getInputStream();
BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(inputStream));
ByteArrayBuffer byteArrayBuffer = new ByteArrayBuffer(50);
int intResponse = httpCon.getResponseCode();
while ((intResponse = bufferedReader.read()) != -1) {
byteArrayBuffer.append(intResponse);
}
responseStorage = new String(byteArrayBuffer.toByteArray());
} catch (Exception aException) {
responseStorage = aException.getMessage();
}
return responseStorage;
}
protected void onPostExecute(String result) {
aTextView.setText(result);
}
}
android
android-asynctask
Stella
la source
la source
Réponses:
Facile:
Créez une
interface
classe, oùString output
est facultative, ou peut être n'importe quelle variable que vous souhaitez renvoyer.Accédez à votre
AsyncTask
classe et déclarez l'interface enAsyncResponse
tant que champ:Dans votre activité principale, vous devez vous
implements
connecterAsyncResponse
.MISE À JOUR
Je ne savais pas que c'était un favori pour beaucoup d'entre vous. Voici donc la manière simple et pratique d'utiliser
interface
.toujours en utilisant même
interface
. Pour info, vous pouvez combiner cela enAsyncTask
classe.en
AsyncTask
classe:faites cela dans votre
Activity
classeOu, implémentant à nouveau l'interface sur l'activité
Comme vous pouvez voir 2 solutions ci-dessus, la première et la troisième, il faut créer une méthode
processFinish
, l'autre, la méthode est à l'intérieur du paramètre de l'appelant. Le troisième est plus soigné car il n'y a pas de classe anonyme imbriquée. J'espère que cela t'aidesAstuce : le changement
String output
,String response
etString result
à différents types de correspondance afin d'obtenir différents objets.la source
Il y a quelques options:
Incorporez la
AsyncTask
classe dans votreActivity
classe. En supposant que vous n'utilisez pas la même tâche dans plusieurs activités, c'est le moyen le plus simple. Tout votre code reste le même, vous déplacez simplement la classe de tâches existante pour qu'elle soit imbriquée dans la classe de votre activité.Créez un constructeur personnalisé pour votre
AsyncTask
qui prend une référence à votreActivity
. Vous instancieriez la tâche avec quelque chose commenew MyAsyncTask(this).execute(param1, param2)
.la source
static
? Il suffit d' utiliser toutfieldOrMethod
deMyActivity
ouMyActivity.this.fieldOrMethod
si elle est occulté.MyAsyncTask
n'est pas une classe interne.private
/protected
pour les classes de niveau supérieur n'est pas autorisé, donc je pensais que ce devait être unestatic
classe non interne.J'ai senti que l'approche ci-dessous est très facile.
J'ai déclaré une interface pour le rappel
Puis créé une tâche asynchrone pour répondre à tout type de requêtes parallèles
Appelé ensuite la tâche asynchrone en cliquant sur un bouton dans la classe d'activité.
Merci
la source
Vous pouvez essayer ce code dans votre classe principale. Cela a fonctionné pour moi, mais j'ai mis en œuvre des méthodes d'une autre manière
la source
execute()
, voyez ma réponse, j'ai ajouté un commentaire là-bas. vous voudrez peut-être vérifier ma réponse mise à jour. J'espère que cela t'aides.Cette réponse est peut-être en retard, mais je voudrais mentionner peu de choses lorsque vous
Activity
dépendezAsyncTask
. Cela vous aiderait à éviter les plantages et la gestion de la mémoire. Comme déjà mentionné dans les réponses ci-dessusinterface
, nous les appelons également des rappels. Ils travailleront en tant qu'informateur, mais n'enverront jamais de référence forteActivity
ouinterface
utiliseront toujours une référence faible dans ces cas.Veuillez vous référer à la capture d'écran ci-dessous pour savoir comment cela peut causer des problèmes.
Comme vous pouvez le voir si nous avons commencé
AsyncTask
avec une référence forte, il n'y a aucune garantie que notreActivity
/Fragment
sera vivant jusqu'à ce que nous obtenions des données, il serait donc préférable d'utiliserWeakReference
dans ces cas et cela aidera également à la gestion de la mémoire car nous ne tiendrons jamais la référence forte de notreActivity
alors il sera éligible au ramassage des ordures après sa déformation.Consultez l'extrait de code ci-dessous pour savoir comment utiliser WeakReference génial -
MyTaskInformer.java
Interface qui fonctionnera comme un informateur.MySmallAsyncTask.java
AsyncTask pour effectuer une tâche de longue durée, qui utiliseraWeakReference
.MainActivity.java
Cette classe est utilisée pour démarrer monAsyncTask
implémentationinterface
sur cette classe etoverride
cette méthode obligatoire.la source
dans votre Oncreate ():
"
} `
la source
Vous pouvez le faire en quelques lignes, remplacez simplement onPostExecute lorsque vous appelez votre AsyncTask. Voici un exemple pour vous:
J'espère que cela vous a aidé, codage heureux :)
la source
onPostExecute
méthode.Pourquoi les gens compliquent-ils la tâche?
Cela devrait être suffisant.
N'implémentez pas onPostExecute sur la tâche asynchrone, implémentez-le plutôt sur l'activité:
la source
@Override
?Vous pouvez appeler la
get()
méthode deAsyncTask
(ou la surchargeget(long, TimeUnit)
). Cette méthode se bloquera jusqu'à ce que leAsyncTask
ait terminé son travail, auquel cas il vous renverra leResult
.Il serait sage de faire un autre travail entre la création / démarrage de votre tâche asynchrone et l'appel de la
get
méthode, sinon vous n'utilisez pas la tâche asynchrone très efficacement.la source
Vous pouvez écrire votre propre auditeur. C'est la même réponse que HelmiB mais semble plus naturel:
Créer une interface d'écoute:
Écrivez ensuite votre tâche asynchrone:
Enfin implémentez l'écouteur en activité:
Et voici comment vous pouvez appeler asyncTask:
la source
Salut, vous pouvez faire quelque chose comme ça:
Créer une classe qui implémente AsyncTask
Ajouter dans l'activité principale
la source
Créez un membre statique dans votre classe d'activité. Attribuez ensuite la valeur pendant la
onPostExecute
Par exemple, si le résultat de votre AsyncTask est une chaîne, créez une chaîne statique publique dans votre activité
public static String dataFromAsyncTask;
Ensuite, dans le
onPostExecute
AsyncTask, faites simplement un appel statique à votre classe principale et définissez la valeur.MainActivity.dataFromAsyncTask = "result blah";
la source
Je le fais fonctionner en utilisant le filetage et le gestionnaire / message. Étapes comme suit: Déclarez une boîte de dialogue de progression
Créez une fonction pour fermer la boîte de dialogue lorsque l'opération est terminée.
Codez vos détails d'exécution:
la source
Vous devez utiliser des «protocoles» pour déléguer ou fournir des données au
AsynTask
.Délégués et sources de données
Un délégué est un objet qui agit au nom ou en coordination avec un autre objet lorsque cet objet rencontre un événement dans un programme. ( Définition Apple )
les protocoles sont des interfaces qui définissent certaines méthodes pour déléguer certains comportements.
Voici un exemple complet !!!
la source
essaye ça:
Et exemple d'utilisation:
la source
Je vais probablement un peu trop loin mais j'ai fourni des rappels pour le code d'exécution et les résultats. évidemment, pour la sécurité des threads, vous voulez faire attention à ce à quoi vous accédez dans votre rappel d'exécution.
L'implémentation AsyncTask:
Un rappel:
Et enfin exécution de la tâche asynchrone:
la source
J'espère que vous avez vécu cela , sinon veuillez lire.
https://developer.android.com/reference/android/os/AsyncTask
Selon la nature des données de résultat, vous devez choisir la meilleure option possible à laquelle vous pouvez penser.
C'est un excellent choix pour utiliser une interface
d'autres options seraient ..
Si la classe AsyncTask est définie dans la classe même dans laquelle vous souhaitez utiliser le résultat. Utilisez une variable globale statique ou get () , utilisez-la à partir de la classe externe ( variable volatile si nécessaire). mais doit être conscient de la progression de AsyncTask ou doit au moins s'assurer qu'il a terminé la tâche et que le résultat est disponible via la méthode variable / get () globale. vous pouvez utiliser l' interrogation, onProgressUpdate (Progress ...) , la synchronisation ou les interfaces (qui vous conviennent le mieux)
Si le résultat est compatible pour être une entrée sharedPreference ou s'il est correct d'être enregistré en tant que fichier dans la mémoire, vous pouvez l' enregistrer même à partir de la tâche d'arrière-plan elle-même et utiliser la méthode onPostExecute ()
pour être averti lorsque le résultat est disponible dans la mémoire.
Si la chaîne est suffisamment petite et doit être utilisée au début d'une activité. il est possible d'utiliser des intentions ( putExtra () ) dans onPostExecute () , mais n'oubliez pas que les contextes statiques ne sont pas aussi sûrs à gérer.
Si possible, vous pouvez appeler une méthode statique à partir de la méthode onPostExecute (), le résultat étant votre paramètre
la source