Comment puis-je retourner une liste de tableaux de mon AsyncTask?
J'ai un AsynkTask méthode sur mon MainActivity que c'est le suivant:
class chargeCars extends AsyncTask<Void, Integer, ArrayList<Car>> {
protected void onPreExecute(){
}
protected ArrayList<Car> doInBackground(Void... params) {
ArrayList<Car> cars = new ArrayList<Car>();
cars.add(new Car(1,"Car1");
cars.add(new Car(2,"Car2");
cars.add(new Car(3,"Car3");
return cars;
}
protected void onProgressUpdate(){
}
protected void onPostExecute(ArrayList<Car> c){
}
}
où Car
c'est un objet que j'ai déclaré dans une autre Class
et quel constructeur, c'est:
public Car(int idCar, String name)
{
this.idCar = idCar;
this.name = name;
}
et je sais que return cars;
renvoie la ArrayList
nommé cars
à la méthode onPostExecute
mais j'ai essayé de récupérer ce ArrayList
à partir de là, et je ne pouvais pas car il me dit toujours qu' onPostExecute
méthode doivent être Void
.
J'ai aussi un autre ArrayList
déclaré, dans ma MainActivity
classe:
ArrayList<Car> totalCars = new ArrayList<Car>();
donc ce que j'ai essayé de cloner cars
ArrayList dans mon totalCars
ArrayList dans mon onPostExecute
méthode, mais il me donne une erreur dans lequel il est dit que:
"clone ()" a protégé l'accès en java.lang.L'objet'
Ici c'est le code d'essayer de cloner mon ArrayList:
protected void onPostExecute(ArrayList<Car> c)
{
for(Car cr: c)
{
totalCars.add(cr.clone());
}
}
Donc, j'ai aussi essayé d'ajouter mes valeurs directement à mon totalCars
liste de tableaux sur mon doInBackground
méthode:
totalCars.add(new Car(1,"Car1");
totalCars.add(new Car(2,"Car2");
totalCars.add(new Car(3,"Car3");
mais quand j'execute mon AsyncTask
méthode:
new chargeCars().execute();
la taille de mon totalCars
ArrayList il est égal à 0.
Que dois-je faire? Je suis totalement bloquer et j'ai cherché dans la une réponse, mais je ne pouvais pas trouver quelque chose qui contribue à moi.
EDIT: Mon Car
Classe c'est:
public class Car {
private int idCar;
private String name;
public Car(){};
public Car(int idCar, String name)
{
this.idCar = idCar;
this.name = name;
}
public void setIdCar(int idCar)
{
this.idCar = idCar;
}
public int getIdCar()
{
return idCar;
}
public void setName(String name)
{
this.name = name;
}
public String getName()
{
return name;
}
}
EDIT 2: j'ai mis quelques journaux pour voir exactement ce que fait mon programme et j'ai obtenu des résultats étranges:
Comme Clairvoyant
dit, j'utilise deux de ses méthodes, mais aucun d'entre eux fonctionne. Que pouvais-je vu? Eh bien, j'ai vu que dans le onPostExecute
méthode de l'ArrayList contient les valeurs dans les deux méthodes. Ici, il n'y a pas de problème.
Le problème c'est que lorsque j'exécute les AsyncTask dans la méthode onCreate
de mon MainActivity
classe, mon ArrayList totalCars
n'ont pas de valeur à l'intérieur, mais dans la méthode onPostExecute
de mon AsyncTask il dispose de toutes les valeurs que j'ai mis à l'intérieur de la liste de tableaux.
Quel pourrait être le problème?
EDIT 3: j'ai aussi essayé avec:
public class MainActivity extends ActionBarActivity {
ArrayList<Car> cars = new ArrayList<Car>();
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
new chargeCars().execute();
Log.d("Size onCreate: ", "" + cars.size()); //It returns me a 0 -->Incorrect
}
class chargeCars extends AsyncTask<Void, Integer, Boolean> {
protected void onPreExecute(){
}
protected ArrayList<Car> doInBackground(Void... params) {
cars.add(new Car(1,"Car1");
cars.add(new Car(2,"Car2");
cars.add(new Car(3,"Car3");
Log.d("Size: ", "" + cars.size()); //It gives me the size equals to 3 -->Correct
return true;
}
protected void onProgressUpdate(){
}
protected void onPostExecute(boolean c){
}
}
}
Mais ne fonctionne toujours pas. J'ai également essayé de faire une ProgressDialog
pour être sûr que mon AsyncTask c'est fini, quand j'essaie d'utiliser mon Log
dans mon onCreate
méthode, mais il me donne un message d'erreur (j'ai une autre question dans ce sujet mais je ne sais pas si c'est une bonne pratique de SORTE à faire directement référence à une autre question si je ne poste pas ici).
Je fais quelque chose de mal? Pourquoi, dans mon doInBackground
il me donne la bonne size
de la ArrayList
et dans mon onCreate
méthode non?
Merci d'avance!
J'ai ma liste de tableaux
totalCars
à l'extérieur de mon AsyncTask et quand je n'ai rien retourner et ajouter les objets directement à elle, il ne fonctionnera pas non plus.Avez-vous déboguer votre code???
J'ai mis quelques journaux après l'exécution de mon AsyncTask pour voir ce que ça donne pour moi.
J'ai édité ma question avec les résultats que j'ai vu avec vos méthodes. Quel pourrait être le problème?
OriginalL'auteur Francisco Romero | 2015-06-09
Vous devez vous connecter pour publier un commentaire.
Parce que l'exécution est asynchrone et le
UI Thread
n'est pas la façon la fin de l'exécution de votreAsyncTask
de poursuivre son flux d'exécution. Pour obtenir les résultats, lorsque votreAsyncTask
termine son exécution, sans blocage de laUI Thread
, vous pouvez utiliser un délégué/lister.Nous allons déclarer une interface sur le haut de votre Activité, et de laisser pas implémenter cette interface (vous aurez besoin de mettre en œuvre les méthodes). Lorsque
onCarsCompleted
est invoquée vous serez en mesure d'imprimer de la taille correcte de votreArrayList
maintenant, nous ajoutons un constructeur à votre
AsyncTask
, qui prend comme paramètre un objet de typeOnCarsListener
, et nous gardons un membre de la référence à l'objet dans le champ d'application dechargeCars
, etonPostExecute
nous communiquer de retour à laActivity
le résultat de votre calcul:Et bien sûr, vous avez besoin d'instancier l'AsyncTask comme
new chargeCars(this).execute();
OriginalL'auteur Blackbelt
Méthode 1:
N'utilisez pas de clone suffit d'utiliser un objet pour ajouter:
Méthode 2:
Faire une méthode qui sera appelée par onPostExceute() après qu'il a obtenu ArrayList
super.onPostExecute();
il me donne une erreur qui dit:'onPostExecute(java.util.ArrayList<com.example.user.project.Car>)' in 'android.os.AsyncTask' cannot be applied to '()'
Si je le quitter, je n'ai pas de résoudre mon problème. J'ai aussi 2 des doutes: pourquoi vous utilisez
super.onPostExecute()
et que voulez-vous dire avec//Code for further execution
? Maintenant, je vais essayer de faire de même avec la deuxième méthode. Merci!!!!Set liste de tableaux en paramètre dans super.onPostExecute(c);
code pour la poursuite de l'exécution n'en est rien, si vous voulez mettre n'importe quel code pour l'exécution après la mise arraylist vous pouvez le faire
J'ai mis de la super.onPostExecute comme vous l'avez dit à moi et la première méthode me donne aussi de la taille de mon ArrayList est égal à 0.
OriginalL'auteur Pankaj