Как передать два разных типа данных в AsyncTask, Android
У меня есть метод, который выполняет обновление базы данных SQLite и помещает его в AsyncTask, чтобы сделать его быстрее и надежнее.
однако есть две части данных, которые необходимы для обновления базы данных. один является целым числом, а другой является объектом класса PrimaryKeySmallTank, который показан здесь.
используя массив params в аргументах метода doInBackground AsyncTask, я могу передать 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
3 ответа
Вы должны создать конструктор для этого.
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();
Просто передайте требуемый объект в конструктор асинхронной задачи, а затем используйте этот объект в 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();
Вы также можете попробовать что-то вроде этого:
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];