Передача параметров в Asynctask
Я использую асинхронные задачи, чтобы получить строку из меню и загрузить некоторые вещи..но я не в состоянии сделать это..я использую его правильно, и я правильно передаю параметры? Пожалуйста, см. фрагмент кода. спасибо
private class Setup extends AsyncTask<Void, Integer, Void> {
@Override
protected Void doInBackground(Void... params) {
try {
if (!(getIntent().getExtras().isEmpty())) {
Bundle gotid = getIntent().getExtras();
identifier = gotid.getString("key");
}
} catch (Exception e) {
e.getStackTrace();
} finally {
if (identifier.matches("abc")) {
publishProgress(0);
db.insert_fri();
} else if ((identifier.matches("xyz"))) {
publishProgress(1);
db.insert_met();
}
}
return null;
}
@Override
protected void onProgressUpdate(Integer... i) {
// start the song here
if (i[0] == 0) {
song.setLooping(true);
song.start();
}
}
@Override
protected void onPostExecute(Void res) {
}
@Override
protected void onPreExecute() {
// do something before execution
}
}
4 ответов
вместо этого я бы делать
private class Setup extends AsyncTask<String, Integer, Void> {
@Override
protected Void doInBackground(String... params) {
String identifier = params[0];
if (identifier.matches("abc")) {
publishProgress(0);
db.insert_fri();
} else if ((identifier.matches("xyz"))) {
publishProgress(1);
db.insert_met();
}
}
return null;
}
@Override
protected void onProgressUpdate(Integer... i) {
// start the song here
if (i[0] == 0) {
song.setLooping(true);
song.start();
}
}
@Override
protected void onPostExecute(Void res) {
}
@Override
protected void onPreExecute() {
// do something before execution
}
}
и проверьте "идентификатор" перед вызовом asynctask, чтобы предотвратить накладные расходы на создание AsyncTask
такой
if (!(getIntent().getExtras().isEmpty())) {
Bundle gotid = getIntent().getExtras();
identifier = gotid.getString("key");
new Setup().execute(identifier);
}
не добавлять конструктор.
просто передайте свои параметры в методе выполнения задачи
new BackgroundTask().execute(a, b, c); // can have any number of params
теперь ваш фоновый класс должен выглядеть следующим образом
public class BackgroundTask extends AsyncTask<String, Integer, Long> {
@Override
protected Long doInBackground(String... arg0) {
// TODO Auto-generated method stub
String a = arg0[0];
String b = arg0[1];
String c = arg0[2];
//Do the heavy task with a,b,c
return null;
}
//you can keep other methods as well postExecute , preExecute, etc
}
AsyncTask означает, что doInBackground() возвращает Void, onProgressUpdate () принимает целочисленные параметры и doInbackground принимает... Струнные парамы !
поэтому вам не нужно (и действительно не следует) использовать Intent, так как он предназначен для передачи аргументов через действия, а не потоки.
и, как уже говорилось ранее, вы можете сделать конструктор и глобальный параметр для своего класса под названием "identifier"
public class Setup...
{
private String identifier;
public Setup(String a) {
identifier = a;
}
}
надеялся, что это поможет. С уважением