【问题标题】:how to pass in two different data types to AsyncTask, Android如何将两种不同的数据类型传递给AsyncTask,Android
【发布时间】:2013-08-01 09:17:45
【问题描述】:

我有一个方法可以更新 SQLite 数据库并将其放入 AsyncTask 中,以使其更快、更可靠。

但是,更新数据库需要两条数据。一个是整数,另一个是此处显示的 PrimaryKeySmallTank 类的对象。

使用 AsyncTask 的 doInBackground 方法的参数中的 params 数组,我可以传入一个 Integer,但是如果我有两种不同类型的数据呢?

如果整数存储在 int...params[0] 中,我无法在 params[1] 中存储不同类型的对象,那么对此可以做些什么呢?

我想传递给 AsyncTask 的对象

public class PrimaryKeySmallTank {

int contractNumber;
int customerCode;
int septicCode;
String workDate;
int workNumber;

}

我正在使用的 AsyncTask

 public class UpdateInfoAsyncTask extends AsyncTask<Integer, Void, Void>{

  @Override
  protected void onPreExecute() {
   // TODO Auto-generated method stub

  }

  @Override
  protected Void doInBackground(Integer... params) {
      Integer mIntegerIn = params[0];  // this is what I want to do, example
      PrimaryKeySmallTank mPrimaryKeySmallTank = params[1];  // different data type to pass in

      Database db = new Database(InspectionInfoSelectionList.this);
        db.openToWrite();
        db.updateWorkClassificationByRow(mPrimaryKeySmallTank, mIntegerIn);
        db.close();

           return null;
  }

 } // end UpdateInfoAsyncTask

【问题讨论】:

  • 你可以在UpdateInfoAsyncTask()构造函数中传递需要的对象。只需为您的异步任务创建一个构造函数
  • doInBackground 方法中的代码是否可以访问作为 UpdateAsyncTask 类的成员变量的数据?就像我可以制作类的成员变量并将数据传递给构造函数一样
  • @Kevik,是的。当然可以。正如您在我的回答中看到的那样,我在doInBackground 方法中写了use intValue。您可以在需要时在该类范围内使用这些成员变量。 :)
  • 是的。放置在 doInBackground 方法中的代码可以访问传递给构造函数的数据。我添加了一个示例也是我的答案

标签: android multithreading android-asynctask


【解决方案1】:

你应该为此创建一个构造函数。

public class UpdateInfoAsyncTask extends AsyncTask<Void, Void, Void>{
  int intValue;
  String strValue;

  public UpdateInfoAsyncTask(int intValue,String strValue){
      this.intValue = intValue;
      this.strValue = strValue;
  }

  @Override
  protected void onPreExecute() {
   // TODO Auto-generated method stub

  }

  @Override
  protected Void doInBackground(Void... params) {
      //use intValue
      //use strValue
       return null;
  }
}

使用它

new UpdateInfoAsyncTask(10,"hi").execute();

【讨论】:

  • 我举了两个参数的例子,但是你可以传递任意数量的参数。很高兴帮助:)
  • @ChintanRathod 需要你的帮助stackoverflow.com/questions/18054704/…
  • UpdateInfoAsyncTask(10,"Hi").execute 中的 10 是多少? @ChintanRathod
  • @SrujanBarai 好问题!它是UpdateInfoAsyncTask 构造函数的参数。
  • 这是一个愚蠢的问题。不知道我在想什么。大声笑。
【解决方案2】:

只需在异步任务的构造函数中传递所需的对象,然后在 doinBackground() 中使用此对象。您可以通过以下方式创建构造函数并传递您的对象:

public class MyAsyncTask extends AsyncTask<Void, Void, Void>{

    PrimaryKeySmallTank tankObj;

    public UpdateInfoAsyncTask(PrimaryKeySmallTank obj ){
        tankObj=obj;
    }

    @Override
    protected void onPreExecute() {
       // TODO Auto-generated method stub
    }

    @Override
    protected Void doInBackground(Void... params) {
        //code and use tankObj
         return null;
    }
}

在您的代码中传递所需的对象:

new myAsyncTask(new PrimaryKeySmallTank (1,1,1,"hi",1).execute();

【讨论】:

    【解决方案3】:

    你也可以试试这样的:

    private class xyz extends AsyncTask<Object, Void, String> {
    
    @Override
    protected String doInBackground(Object... objects) {
    
    Long abc = (Long)objects[0];
    String pqr = (String)objects[1];
    .
    .
    .
    

    只是一个简单的评论。这样,需要指出的是,不能传递原始数据(因为原始数据不能存储为对象)。对于原始数据,唯一的方法是让包装器(如整数、布尔值等)像往常一样转换。例如,

    int i = (Integer) objects[0];
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-03-05
      • 2016-02-28
      • 1970-01-01
      • 2013-12-16
      • 1970-01-01
      • 2018-01-02
      相关资源
      最近更新 更多