Как передать два разных типа данных в 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];