Android - AsyncTask de la classe et de la méthode Execute
J'ai le code à l'aide de la classe AsyncTask pour remplir une listView avec plusieurs contacts à partir d'une base de données.
@Override
protected void onResume()
{
super.onResume();
new MyTask().execute((Object[]) null);
} //end method onResume
1.- Pourquoi dois-je passer ce: (Object[]) null)
comme argument?
Voir l'AsyncTask code:
private class MyTask extends AsyncTask<Object, Object, Cursor>
{
//used for database conection purpose
ConectToDatabase databaseConnector =
new ConectToDatabase(ThisClass.this);
@Override
protected Cursor doInBackground(Object... params)
{
databaseConnector.open();
return databaseConnector.getMyContacts();
}
//use the Cursor returned from the doInBackground method
@Override
protected void onPostExecute(Cursor result)
{
//My cursorAdadper defined in early code
contactAdapter.changeCursor(result);
databaseConnector.close();
}
}
Un autre AsyncTask question:
delete.execute(new Long[] { rowID });
2.- Pourquoi dois-je passer ce: (new Long[] { rowID })
comme un argument et non un simple (rowId)?
rowID est un type long qui contient l'id du contact sélectionné dans ma classe précédente. C'était extendend dans une ListActivity. Cette classe précédente a été rempli par tous mes contacts obtenus dans ma base de données. Quand je suis envoyé des données dans cette classe(par une intention) je veux récupérer les données de contact unique sélectionné dans ma classe précédente, mais dans ce cas, le code s'affiche de cette façon: new LoadMyContact().execute(rowID);
situé dans onResume méthode.
3.- Pourquoi dois-je passer seulement: (rowID)
comme argument ?
delete.execute(new Long[] { rowID });
est à l'intérieur d'un menu, lorsque l'utilisateur de confirmer la suppression du contact que nous avons l'exécution de cette peine, le code sera présent pour la supprimer(nous sommes à l'intérieur d'un clic d'un bouton):
@Override
public void onClick(DialogInterface dialog, int button)
{
final ConectToDataBase databaseConnector =
new ConectToDataBase(MySecondClass.this);
AsyncTask<Long, Object, Object> deleteTask =
new AsyncTask<Long, Object, Object>()
{
@Override
protected Object doInBackground(Long... params)
{
databaseConnector.deleteContact(params[0]);
return null;
}
@Override
protected void onPostExecute(Object result)
{
finish();
delete.execute(new Long[] { rowID });
}
}; //end new AsyncTask
delete.execute(new Long[] { rowID });
} /
Aider avec cette troisième question et merci.
Long != long
OriginalL'auteur user2580401 | 2013-08-18
Vous devez vous connecter pour publier un commentaire.
AsyncTask
a la formeAsyncTask<Param, Progress, Return>
avecexecute
à l'aide de laParam
type.#1
Il est possible d'écrire
execute(null)
. Cette opération aboutit à laConfusing 'null' argument to var-arg method
avertissement dans IntelliJ IDEA. Cet avertissement fait remarquer qu'il n'est pas enroulé comme un simple élément de tableau. Donc, commeParam
estObject
dans ce cas,execute((Object[])null)
est utilisé pour supprimer l'avertissement.Depuis argument variable de paramètres n'ont pas une valeur, vous pouvez utiliser
execute()
à la place.#2 & #3
Dans ce cas,
Param
estLong
, de sorte que la méthode execute a la formeexecute(Long...)
. Sans l'argument variable sucre syntaxique, c'est le même queexecute(Long[])
. Par conséquent, lanew Long[]{ rowId }
est explicitement la création de laLong
tableau à un seul élément (rowId
). CommerowId
est unlong
, le compilateur Java automatiquement "boîtes" (enveloppe) qui entier dans unLong
objet-l'équivalent de l'écriturenew Long(rowId)
.Comme le
execute
méthode utilise la variable d'arguments, vous n'avez pas besoin d'allouer de laLong
tableau -- le compilateur Java va le faire pour vous, vous pouvez simplement écrireexecute(rowId)
à la place. Qui est, le compilateur Java est en pleine expansionexecute(rowId)
enexecute(new Long[]{ new Long(rowId) })
.Par conséquent, #2 et #3 sont équivalents.
OriginalL'auteur reece
La réponse à toutes vos questions est une
AsyncTask
logique:Alors que la définition de
AsyncTask
, nous avons besoin de déclarer 3 paramètres:private class MyTask extends AsyncTask<Object, Object, Cursor>
Comme dans votre cas ci-dessus, vous avez donné de l'Objet, l'Objet, le Curseur.
Maintenant, le 1er paramètre est défini lors de la "exécuter" appel, et est utilisé par
doInBackGround()
fonction. Ce programme a été conçu pour être un tableau de type défini de sorte que nous pouvons envoyer plusieurs données. Par exemple, nous pouvons faire:myTask.execute(url1, url2, url3)
pour monAsysncTask
dont le 1er paramètre est l'URL. DansdoInBackGround()
fonction, nous pouvons évaluer l'url[0], adresse url[1], adresse url[2]2ème Paramètre dans
AsyncTask
est utilisé paronProgressUpdate()
fonction et il s'attend également à recevoir de tableau de type défini.3e Paramètre dans
AsyncTask
est utilisé paronPostExecute()
la fonction et la valeur rerturned pardoInBackGround()
fonction. En n'ont pas besoin d'être un tableau de type défini.Pas tous les types sont toujours utilisés par une tâche asynchrone. Pour marquer un type comme la non-utilisation, il suffit d'utiliser le type Void:
privé de classe MyTask extends AsyncTask { ... }
Le lien ci-dessous les détails à propos de
AsyncTask
qui sera répondre à tous les 3 la question de la vôtre:http://developer.android.com/reference/android/os/AsyncTask.html
bonne réponse, mais pourquoi est-il dans le code de format? lol
J'espère que ça semble normal maintenant. Merci pour le tuyau. Encore en apprentissage de format de choses 🙂
OriginalL'auteur Sushil