Передача параметров в Asynctask - PullRequest
17 голосов
/ 03 сентября 2011

Я использую асинхронные задачи, чтобы получить строку из меню и загрузить некоторые вещи ... но я не могу этого сделать. Использую ли я это правильно и правильно ли я передаю параметры?Пожалуйста, посмотрите фрагмент кода.спасибо

  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 ]

29 голосов
/ 04 августа 2013

Избегайте добавления конструктора.

Просто передайте свои параметры в методе выполнения задачи

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

}
15 голосов
/ 03 сентября 2011

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

 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

как это

if (!(getIntent().getExtras().isEmpty())) {
                Bundle gotid = getIntent().getExtras();
                identifier = gotid.getString("key");
               new Setup().execute(identifier);
    }
4 голосов
/ 04 сентября 2011

Простой способ - добавить конструктор:

public Setup(String a, Int b) {
    this.a = a;
    this.b = b;
}
0 голосов
/ 29 октября 2011

AsyncTask означает, что doInBackground () возвращает Void, onProgressUpdate () принимает целочисленные параметры, а doInbackground принимает ... строковые параметры!

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

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

public class Setup...
{
    private String identifier;

    public Setup(String a) {
    identifier = a;
    }
}

Надеялся, что это может помочь. Привет

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...