Android 如何从AsyncTask返回ArrayList?

Android 如何从AsyncTask返回ArrayList?,android,arraylist,android-asynctask,Android,Arraylist,Android Asynctask,我的主要活动中有一个AsynkTask方法,它如下所示: class chargeCars extends AsyncTask<Void, Integer, ArrayList<Car>> { protected void onPreExecute(){ } protected ArrayList<Car> doInBackground(Void... params) { ArrayLi

我的主要活动中有一个AsynkTask方法,它如下所示:

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

        }
    }
我知道
还车
将名为
cars
ArrayList
返回给方法
onPostExecute
,但我试图从那里检索这个
ArrayList
,但我不能,因为它总是告诉我
onPostExecute
方法必须是
Void

我还在我的
main活动
类中声明了另一个
ArrayList

ArrayList<Car> totalCars = new ArrayList<Car>();
因此,我还尝试将我的值直接添加到我的
doInBackground
方法的
totalCars
ArrayList中:

totalCars.add(new Car(1,"Car1");
totalCars.add(new Car(2,"Car2");
totalCars.add(new Car(3,"Car3");
new chargeCars().execute();
但是当我执行我的
AsyncTask
方法时:

totalCars.add(new Car(1,"Car1");
totalCars.add(new Car(2,"Car2");
totalCars.add(new Car(3,"Car3");
new chargeCars().execute();
my
totalCars
ArrayList的大小等于0

我该怎么办?我完全被阻塞了,我在里面搜索答案,但是我找不到任何对我有帮助的东西

编辑:My
Car
Class它是:

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:我放了一些日志,看看我的程序到底做了什么,结果很奇怪:

正如透视者所说,我使用了他的两种方法,但其中任何一种都有效。我能看到什么?我看到在
onPostExecute
方法中,ArrayList在这两种方法中都包含值。这里没有问题

问题在于,当我在
main activity
类的
onCreate
方法中执行AsyncTask时,我的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){

        }
    }
}
公共类MainActivity扩展了ActionBarActivity{
ArrayList cars=新的ArrayList();
创建时受保护的void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
新chargeCars().execute();
Log.d(“Size onCreate:,”“+cars.Size());//它返回一个0-->错误
}
类chargeCars扩展异步任务{
受保护的void onPreExecute(){
}
受保护的ArrayList doInBackground(无效…参数){
添加(新车(1,“Car1”);
添加(新车(2,“Car2”);
添加(新车(3,“Car3”);
Log.d(“大小:”,“+cars.Size());//它给我的大小等于3-->正确吗
返回true;
}
受保护的void onProgressUpdate(){
}
受保护的void onPostExecute(布尔c){
}
}
}
但仍然不起作用。我还尝试创建一个
ProgressDialog
,以确保在我的
onCreate
方法中使用
Log
时异步任务完成,但它也给了我一个错误(关于这一点,我有另一个问题,但我不知道直接引用另一个问题是否是一个好的做法,所以我不在这里发布)

我做错了什么吗?为什么在我的
doInBackground
中,它给出了
ArrayList
的正确
大小,而在我的
onCreate
方法中却没有

提前感谢!

方法1: 不使用克隆,只使用对象添加:

protected void onPostExecute(ArrayList<Car> c)
{
       super.onPostExecute();
    for(Car cr: c)
    {
        totalCars.add(cr);
    }
       //Code for further execution
}
受保护的void onPostExecute(ArrayList c)
{
super.onPostExecute();
用于(车辆cr:c)
{
添加(cr);
}
//进一步执行的代码
}
方法2: 创建一个在获得ArrayList后将由onPostExcute()调用的方法

 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
}
受保护的void onPostExecute(ArrayList c)
{
super.onPostExecute();
设定值(c);
}
私有void集合值(ArrayList c){
用于(车辆cr:c)
{
添加(cr);
}
//进一步执行的代码
}
我做错什么了吗?为什么在我的背景下它给了我 ArrayList的大小是否正确,在我的onCreate方法中是否不正确

因为执行是异步的,
UI线程
不会在
AsyncTask
的执行结束后继续其执行流程。要返回结果,当
AsyncTask
完成其执行时,在不阻塞
UI线程
的情况下,可以使用委托/列表器

让我们在活动顶部声明一个接口,让它实现这个接口(您需要实现这些方法)。调用
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,如


新的chargeCars(this).execute();

只需声明“ArrayList cars”在asynTask之外,然后添加汽车而不返回任何内容。@AnixPasBesoin我的ArrayList
totalCars
在AsyncTask之外,当我不返回任何内容并直接向其中添加对象时,它也不起作用。你调试过代码吗?@Clarivoyan我在执行AsyncTask后是否放置了一些日志以查看它提供了什么对我来说。@claivoyant我用我在你的方法中看到的结果编辑了我的问题。可能是什么问题?我用你的第一个方法尝试了,但它不起作用。如果我把
super.onPostExecute();
放在“android.os.AsyncTask”中,它会给我一个错误,说:
“onPostExecute(java.util.ArrayList)”,在“android.os.AsyncTask”中不能应用到“()“
如果我退出,我的问题就没有任何解决办法。我还有两个疑问:为什么要使用
super.onPostExecute()
,以及
//进一步执行的代码是什么意思
?现在我将尝试第二个方法。谢谢!在super.onPostExecute(c)中设置ArrayList作为参数;进一步执行的代码不算什么如果你想在设置arraylist后放入任何代码执行,你可以这样做我将super.onPostExecute放在上面,就像你对我说的那样,第一个方法还给我的arraylist的大小等于0.Co
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);
         } 
    }


}