Как передать два разных типа данных в AsyncTask, Android

У меня есть метод, который обновляет базу данных SQLite и помещает это внутри AsyncTask, чтобы сделать его более быстрым и надежным.

однако есть две части данных, которые необходимы для обновления базы данных. один является Integer, а другой является объектом класса PrimaryKeySmallTank, который показан здесь.

используя массив params в аргументах метода doInBackground AsyncTask, я могу передать Integer, но что, если у меня есть два разных типа данных, например здесь?

если целое число хранится в int... params [0] я не может хранить другой объект типа в параметрах [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

Ответы

Ответ 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();

Ответ 2

Просто передайте требуемый объект в конструкторе вашей задачи async, а затем используйте этот объект в 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];
.
.
.

Простое замечание. Таким образом, следует указать, что вы не можете передавать примитивные данные (поскольку примитивы не могут быть сохранены как объект). Для примитивных данных единственный способ состоит в том, чтобы конверты (например, Integer, Boolean и т.д.) Преобразовывались, как обычно. Например,

int i = (Integer) objects[0];