如何在Android中将两种不同的数据类型传递给AsyncTask

15

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

但是,更新数据库需要两个数据:一个是整数,另一个是PrimaryKeySmallTank类的对象,如下所示。

通过在AsyncTask的doInBackground方法的参数中使用params数组,我可以传递一个整数,但如果我有两种不同类型的数据怎么办?

如果将整数存储在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()构造函数中传递所需的对象。只需为您的异步任务创建一个构造函数即可。 - Rachita Nanda
放在doInBackground方法中的代码是否可以访问UpdateAsyncTask类的成员变量数据?就像我可以将类的成员变量传递到构造函数中一样。 - Kevik
@Kevik,是的。你当然可以。正如你在我的回答中所看到的那样,我已经在“doInBackground”方法中写了use intValue。你可以在该类范围内需要时使用这些成员变量。 :) - Chintan Rathod
是的。放置在doInBackground方法中的代码可以访问传递给构造函数的数据。我已经添加了一个例子到我的回答中。 - Rachita Nanda
3个回答

44

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

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();

我举了两个参数的例子,但你可以传递任意数量的参数。很高兴能帮助 :) - Chintan Rathod
@ChintanRathod,需要您的帮助。请看这个链接:http://stackoverflow.com/questions/18054704/how-to-use-scroll-view-in-android - Developer
UpdateInfoAsyncTask(10,"Hi").execute 中的 10 是什么?@ChintanRathod - Srujan Barai
@SrujanBarai 很好的问题!这是UpdateInfoAsyncTask构造函数的一个参数。 - Chintan Rathod
那是一个愚蠢的问题。不确定我当时在想什么。哈哈。 - Srujan Barai

6

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

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

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();

4
您可以尝试类似以下的方式:

您也可以尝试像这样:

private class xyz extends AsyncTask<Object, Void, String> {

@Override
protected String doInBackground(Object... objects) {

Long abc = (Long)objects[0];
String pqr = (String)objects[1];
.
.
.

只是一个简单的注释。需要指出的是您无法传递基本数据类型(因为基础数据类型不能被存储为对象)。对于基本数据类型,唯一的方法是将包装器(如Integer、Boolean等)转换为常规数据类型。例如,

int i = (Integer) objects[0];

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接