Android 如何从AsyncTask返回ArrayList?
我的主要活动中有一个AsynkTask方法,它如下所示: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
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();
mytotalCars
ArrayList的大小等于0
我该怎么办?我完全被阻塞了,我在里面搜索答案,但是我找不到任何对我有帮助的东西
编辑:MyCar
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时,我的ArrayListtotalCars
中没有任何值,但在我的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我的ArrayListtotalCars
在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);
}
}
}