2015-06-09 42 views
4

我有我的MainActivity的AsynkTask方法,它是以下幾點:如何從我的AsyncTask中返回一個ArrayList?

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

     } 
    } 

其中Car這是我在另一個Class已經宣佈,它是其構造方法的對象:

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

,我知道, return cars;返回ArrayList名爲cars的方法onPostExecute,但我試圖從那裏檢索這個ArrayList,我不能,因爲它總是對我說onPostExecute方法必須是Void

我還另外ArrayListMainActivity類中聲明:

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

所以我嘗試它的克隆cars的ArrayList到我totalCars的ArrayList在我onPostExecute方法,但它給了我在上面說的錯誤:

'的clone()' 已在保護 'java.lang.Object繼承'

0123訪問

這是試圖克隆我的ArrayList代碼:

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

所以我也試圖直接添加我的價值觀我totalCars的ArrayList在我doInBackground方法:

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

但是當我執行我AsyncTask方法:

new chargeCars().execute(); 

我的大小totalCars ArrayList它等於0.

我該怎麼辦?我完全封鎖了,我搜索了一個答案,但是我找不到任何對我有幫助的東西。

編輯:Car類是:

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; 
    } 
} 

編輯2:我把一些日誌,看看究竟是什麼我的計劃,我得到了奇怪的結果:

正如Clairvoyant說,我使用他的兩種方法,但其中任何一種都有效。我能看到什麼?那麼,我看到在onPostExecute方法中,ArrayList包含兩個方法中的值。這裏沒有問題。

那就是當我在方法執行的AsyncTask我MainActivity類的onCreate,我的ArrayList totalCars沒有任何價值裏面,但在我的AsyncTask的方法onPostExecute它,我把裏面的所有值的問題ArrayList。

可能是什麼問題?

編輯3:我也試圖與:

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

     } 
    } 
} 

但仍然無法正常工作。我也試圖使ProgressDialog是安全的,我的AsyncTask,它的完成,當我嘗試使用我的Log在我onCreate方法,但它也給了我一個錯誤(我有一個問題在SO這件事,但是我不知道這是否是這是一個很好的做法,可以直接引用另一個問題,所以我不在這裏發表)。

我做錯了什麼?爲什麼我的doInBackground它給我的ArrayList正確size和我onCreate方法呢?

在此先感謝!

+1

只是申報「的ArrayList 車」你asynTask外面,然後添加你的汽車沒有返回任何東西。 – AnixPasBesoin

+0

@AnixPasBesoin我有我的ArrayList'totalCars'我的AsyncTask外,當我不回任何東西,直接添加的對象,它也不起作用。 –

+0

你有沒有調試你的代碼? – Pankaj

回答

6

我做錯什麼了嗎?爲什麼我的doInBackground它給我的ArrayList和我的onCreate方法不正確 大小?

由於執行是異步的,並且UI Thread不會執行AsyncTask的執行結束以繼續其執行流程。得到的結果回來,當你AsyncTask完成它的執行,不會阻塞UI Thread,你可以使用委託/利斯特。

我們宣佈你的活動頂部的接口,並且let't它實現這個接口(您需要實現的方法)。當onCarsCompleted被調用,你就可以打印一份ArrayList

public class MainActivity extends ActionBarActivity implements OnCarsListener { 
     public interface OnCarsListener { 
      void onCarsCompleted(ArrayList<Car> cars); 
      void onCarsError(String error); 
     } 

     // the other code 

     public void onCarsCompleted(ArrayList<Car> cars) { 
      Log.d("Size: ", "" + cars.size()); 
     } 

     public void onCarsError(String error) { 

     } 

}   

正確的尺寸,現在我們添加一個構造函數來你AsyncTask,這需要作爲參數OnCarsListener類型的對象,我們保持一個成員參考我們傳達回你計算的Activity結果在chargeCars範圍的對象,onPostExecute

class chargeCars extends AsyncTask<Void, Integer, ArrayList<Car>> { 

    private final OnCarsListener mListener; 
    ArrayList<Car> cars = new ArrayList<Car>(); 

    public chargeCars(OnCarsListener listener) { 
     mListener = listener; 
    } 

    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 cars; 

    } 

    protected void onProgressUpdate(){ 
    } 

    protected void onPostExecute(ArrayList<Car> cars){ 
     if (mListener != null) { 
       mListener.onCarsCompleted(cars); 
     } 
    } 


} 

當然,你需要實例化的AsyncTask像

new chargeCars(this).execute();

+0

評論是不適合擴展討論;這個對話已經[轉移到聊天](http://chat.stackoverflow.com/rooms/80801/discussion-on-answer-by-blackbelt-how-can-i-return-an-arraylist-from-my- asynctas)。 –

2

方法1: 不要使用克隆只是使用對象補充:

protected void onPostExecute(ArrayList<Car> c) 
{ 
     super.onPostExecute(); 
    for(Car cr: c) 
    { 
     totalCars.add(cr); 
    } 
     //Code for further execution 
} 

方法2: 做一個將由onPostExceute(調用方法)它已得到ArrayList中後

protected void onPostExecute(ArrayList<Car> c) 
    { 
    super.onPostExecute(); 
     setValues(c); 
    } 

private void setValues(ArrayList<Car> c){ 
     for(Car cr: c) 
     { 
      totalCars.add(cr); 
     } 
//Code for further execution 
} 
+0

我嘗試了你的第一種方法,它不起作用。如果我把'super.onPostExecute();'它給了我一個錯誤,說:''onPostExecute(java.util.ArrayList )''android.os.AsyncTask'不能應用於'()'' –

+0

如果我放棄它,我沒有任何解決我的問題。我也有兩個疑問:爲什麼你使用'super.onPostExecute()'和你的意思是用'// Code for further execution'?現在我要試試你的第二種方法。謝謝! –

+0

在super.onPostExecute(c)中設置ArrayList爲參數; – Pankaj