【问题标题】:AsyncTask passing custom objectsAsyncTask 传递自定义对象
【发布时间】:2013-08-12 15:58:07
【问题描述】:

[我有一个自定义的可打包对象 Vehicle]

我看过AsyncTask,但对这个话题不太清楚:

我想将一个字符串(即车辆的车辆 ID)传递给 AsyncTask,然后在 doInBackground() 中我有一个方法

mRemoteInterface.getTrackHistory();

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

这是我不能做的概述。问题是我不明白将对象传递到 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);
    }

}

【问题讨论】:

  • 只需为您的异步任务创建一个构造函数。它比 atte 容易得多,倾向于将细节作为参数传递。
  • 你能再解释一下吗?

标签: java android android-asynctask parcelable


【解决方案1】:

您可以将字符串传递给 asynctask 的构造函数或 doInbackground

   new getTrackHistory(mystringvalue).execute();

然后在构造函数中

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

  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 中返回结果。我假设它的 ArrayList 类型为 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.

【讨论】:

  • 谢谢,这很有道理。您能否详细说明从 onPostExecute() 传递回调用 new getTrackhistory(mystringvalue).execute() 的位置?(这可能吗)
  • @bent 你可以在界面的帮助下做到这一点。我已经回答了一个类似的问题。我会找到链接
  • 啊,谢谢。所以我可以将值传递给 doInBackground() 或构造函数。效果一样。谢谢@Raghunandan!!!
  • 我遇到了一个问题,希望您能帮助我。你能看看吗? stackoverflow.com/questions/18448216/…谢谢!
【解决方案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

    }
}

【讨论】:

    【解决方案3】:

    Asynctask 与其他任何类一样,只是一个类,使用构造函数,或通过 setter、公共成员等填充实例化对象。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-07-16
      • 2012-09-30
      • 1970-01-01
      • 2018-12-30
      相关资源
      最近更新 更多