Передача параметров в Asynctask

Я использую задачи Async, чтобы получить строку из действия меню и загрузить некоторые вещи .. но я не могу этого сделать .. Я использую его в правильном направлении, и я правильно передаю параметры? См. Фрагмент кода. благодаря

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 } } 

Вместо этого я бы сделал

  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 } 

Простым способом является добавление конструктора:

 public Setup(String a, Int b) { this.a = a; this.b = b; } 

AsyncTask означает, что doInBackground () возвращает Void, onProgressUpdate () принимает параметры Integer и doInbackground принимает … Параметры String!

Таким образом, вам не нужно (и ДЕЙСТВИТЕЛЬНО не следует) использовать Intent, поскольку оно предназначено для использования аргументов через Activity, а не Threads.

Как уже говорилось ранее, вы можете сделать конструктор и глобальный параметр для вашего класса под названием «идентификатор»,

 public class Setup... { private String identifier; public Setup(String a) { identifier = a; } } 

Надеюсь, это поможет. С уважением