AsyncTask传递自定义对象

时间:2013-08-12 15:58:08

标签: java android android-asynctask parcelable

[我有一个自定义的parcelable object Vehicle]

我看过AsyncTask但是关于这个话题还不太清楚:

我想将一个String(它是Vehicle的Vehicle ID)传递给AsyncTask,然后在doInBackground()中我有一个方法

mRemoteInterface.getTrackHistory();

给了我一个ArrayList。我想在onPostExecute()中启动一个活动,其中Vehicle ID和ArrayList都是额外的。

这是我无法做到的概述。问题是我不明白将对象INTO到asynctask,然后从doInBackground()传递到onPostExecute()和从onPostExecute()传回原始的执行调用。

getTrackHistory.execute(该怎么办?);

private class getTrackHistory extends
AsyncTask<String, Integer, Boolean **WHAT SHOULD GO HERE?**> {

    @Override
    protected Boolean doInBackground(
            String... params) {
        try {
            String vehicleID = params[0];
            listVehicleHistory = (ArrayList<Vehicle>) mRemoteInterface.getVehicleHistory(vehicleID);
        } catch (Exception e) {

            e.printStackTrace();
        }


    }




    @Override
    protected void onProgressUpdate(Integer... progress) {

    }

    @Override
    protected void onPostExecute(Boolean worked) {

        super.onPostExecute(worked);

        Intent intent = new Intent(MainActivity.this,VehicleInfo.class);

        intent.putExtra("Vehicle ID", toReturn);
        intent.putParcelableArrayListExtra("VehicleHistory", listVehicleHistory);

        startActivity(intent);
    }

}

3 个答案:

答案 0 :(得分:5)

您可以将字符串传递给asynctask或doInbackground

的构造函数
   new getTrackHistory(mystringvalue).execute();

然后在构造函数

  private class getTrackHistory extends

AsyncTask {

  String value; 
  public getTrackHistory(String mystring)
  {
      value= mystring;
  }

编辑:

您还可以将值传递给doInbackground()

   new TheTask().execute("mystring");
   class TheTask extends AsyncTask <String,Void,Void>
    { 
     @Override
     protected void onPreExecute() {
    super.onPreExecute();
    }
    @Override
    protected void onPostExecute(Void result) 
     super.onPostExecute(result);

      }
    @Override
    protected Void doInBackground(String... params) {
    String value = params[0];
    return null;
  }
}

评论中的问题

  new getTrackHistory(mystringvalue,ActivityName.this).execute();

在构造函数中

  String value; 
  TheInterface listener;
  public getTrackHistory(String mystring,Context context)
  {
      value= mystring;
      listener = (TheInterface) context; 
  }

接口

public interface TheInterface {

public void theMethod(ArrayList<String> result); // your result type

 }

然后

在doInbackground中返回结果。我假设它的StringList类型为String。将arraylist更改为适合您的要求。

在你的onPostExecute

if (listener != null) 
{
  listener.theMethod(result); // result is the ArrayList<String>
  // result returned in doInbackground 
  // result of doInbackground computation is a parameter to onPostExecute 
}

在您的活动类中实现接口

  public class ActivityName implements getTrackHistory.TheInterface

然后

 @Override
 public void theMethod(ArrayList<String> result) { // change the type of result according yo your requirement
 // use the arraylist here
 }

使用界面

的类似帖子

Android Parse JSON stuck on get task

答案 1 :(得分:2)

通常的做法是将您的参数/对象传递给AsyncTask的构造函数,存储为成员,然后从doInBackground()引用。例如:

private class getTrackHistory extends AsyncTask<String, Integer, Boolean> {

    Vehicle mVehicle;

    public getTrackHistory( Vehicle v) {
       mVehicle = v;
    }

    @Override
    protected Boolean doInBackground() {

          // use mVehicle member here

    }
}

答案 2 :(得分:0)

Asynctask只是一个类似于任何其他的类,使用构造函数,或通过setter,public members等填充实例化对象。