Wie kann ich eine ArrayList von meiner AsyncTask zurückgeben?

Ich habe eine AsynkTask-Methode in meiner MainActivity, die wie folgt lautet:

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){

        }
    }

woCar es ist ein Objekt, das ich in einem anderen @ deklariert haClass und welcher Konstruktor es ist:

public Car(int idCar, String name)
{
    this.idCar = idCar;
    this.name = name;
}

und ich weiß, dassreturn cars; gibt das @ zurüArrayList genanntcars zur MethodeonPostExecute aber ich habe versucht, diese abzurufenArrayList von dort und ich konnte nicht, weil es mir immer sagte, dassonPostExecute Methode muss @ seVoid.

Ich habe auch ein anderesArrayList in meinem @ deklarieMainActivity class:

ArrayList<Car> totalCars = new ArrayList<Car>();

so was ich versucht habe ist es zu klonencars ArrayList in meintotalCars ArrayList in meinemonPostExecute Methode, aber es gibt mir einen Fehler, in dem es heißt:

'clone ()' hat einen geschützten Zugriff in 'java.lang.Object'

Hier ist es der Code, der versucht, meine ArrayList zu klonen:

protected void onPostExecute(ArrayList<Car> c)
{
    for(Car cr: c)
    {
        totalCars.add(cr.clone());
    }
}

So habe ich auch versucht, meine Werte direkt zu meinem @ hinzuzufügtotalCars ArrayList auf meinemdoInBackground Methode

totalCars.add(new Car(1,"Car1");
totalCars.add(new Car(2,"Car2");
totalCars.add(new Car(3,"Car3");

aber wenn ich mein @ ausfühAsyncTask Methode

new chargeCars().execute();

die Größe meinestotalCars ArrayList ist gleich 0.

Was soll ich machen? Ich bin total blockiert und habe in SO nach einer Antwort gesucht, aber ich konnte nichts finden, was mir hilft.

BEARBEITEN MyCar Klasse es ist:

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: Ich habe einige Protokolle angelegt, um zu sehen, was genau mein Programm macht, und ich habe seltsame Ergebnisse erzielt:

WieClairvoyant sagte, ich benutze beide Methoden, aber jede von ihnen funktioniert. Was konnte ich sehen? Nun, das habe ich im @ gesehonPostExecute -Methode Die ArrayList enthält Werte in beiden Methoden. Hier gibt es kein Problem.

Das Problem ist, dass, wenn ich die AsyncTask in der Methode ausführenonCreate von meinenMainActivity Klasse, meine ArrayListtotalCars hat innen keinen Wert, aber in der MethodeonPostExecute meiner AsyncTask enthält alle Werte, die ich in die ArrayList geschrieben habe.

Was könnte das Problem sein?

EDIT 3: Ich habe es auch versucht mit:

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){

        }
    }
}

Aber funktioniert immer noch nicht. Ich habe auch versucht, ein @ zu machProgressDialog um sicher zu gehen, dass meine AsyncTask beendet ist, wenn ich versuche, mein @ zu verwendLog in meinemonCreate Methode, aber es gibt mir auch einen Fehler (Ich habe eine andere Frage in SO darüber, aber ich weiß nicht, ob es eine gute Praxis in SO ist, direkt auf eine andere Frage zu verweisen, damit ich sie hier nicht poste).

Mache ich etwas falsch? Warum in meinemdoInBackground es gibt mir das richtigesize desArrayList und in meinemonCreate Methode nicht?

Danke im Voraus

Antworten auf die Frage(4)

Ihre Antwort auf die Frage