【发布时间】:2015-08-24 05:12:05
【问题描述】:
我的 MainActivity 上有一个 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){
}
}
其中Car 是我在另一个Class 中声明的对象,它是哪个构造函数:
public Car(int idCar, String name)
{
this.idCar = idCar;
this.name = name;
}
我知道 return cars; 将名为 cars 的 ArrayList 返回到方法 onPostExecute 但我试图从那里检索这个 ArrayList 但我不能,因为它总是对我说 @987654330 @方法必须是Void。
我的MainActivity 类中还声明了另一个ArrayList:
ArrayList<Car> totalCars = new ArrayList<Car>();
所以我尝试在我的onPostExecute 方法中将cars ArrayList 克隆到我的totalCars ArrayList 中,但它给了我一个错误,它说:
'clone()' 在 'java.lang.Object' 中具有受保护的访问权限
这是试图克隆我的 ArrayList 的代码:
protected void onPostExecute(ArrayList<Car> c)
{
for(Car cr: c)
{
totalCars.add(cr.clone());
}
}
所以我也尝试在我的doInBackground 方法上将我的值直接添加到我的totalCars ArrayList:
totalCars.add(new Car(1,"Car1");
totalCars.add(new Car(2,"Car2");
totalCars.add(new Car(3,"Car3");
但是当我执行我的AsyncTask 方法时:
new chargeCars().execute();
我的totalCarsArrayList 的大小等于0。
我该怎么办?我完全被阻止了,我在 SO 中搜索了一个答案,但我找不到任何对我有帮助的东西。
编辑:我的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 包含两个方法中的值。这里没有问题。
问题在于,当我在 MainActivity 类的方法 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){
}
}
}
但还是不行。我还尝试创建一个ProgressDialog 以确保我的 AsyncTask 在我尝试在我的onCreate 方法中使用我的Log 时完成,但它也给了我一个错误(我有另一个关于它的问题,但我不知道直接从另一个问题中引用是否是一种好的做法,所以我不在这里发布)。
我做错了吗?为什么在我的doInBackground 中它给了我正确的size ArrayList 而在我的onCreate 方法中却没有?
提前致谢!
【问题讨论】:
-
只需在你的 asynTask 之外声明“ArrayList
cars”,然后添加你的汽车而不返回任何东西。 -
@AnixPasBesoin 我的 ArrayList
totalCars在我的 AsyncTask 之外,当我不返回任何内容并将对象直接添加到其中时,它也不起作用。 -
你的代码调试了吗???
-
@Clairvoyant 我在执行 AsyncTask 后放了一些日志,看看它给了我什么。
-
@Clairvoyant 我用你的方法看到的结果编辑了我的问题。可能是什么问题?
标签: android arraylist android-asynctask