Использование общих переменных между событиями AsyncTask - PullRequest
0 голосов
/ 27 ноября 2018

У меня есть класс AsyncTask, который я хотел бы передать в него некоторые примитивные параметры через constructor.Затем выполните некоторые манипуляции с переменными в методе onPreExecute (Запуск в основном потоке), а затем используйте переменные внутри doInBackground (Запуск в рабочем потоке).Это нормально делать это?Или для этого нужна какая-то синхронизация?

private class MyClass extends AsyncTask<Void, Void, Void> {
    //shared variables
    Long Num1;
    int Num2;

    private MyClass (Long num1, int num2){
        Num1 = num1;
        Num2 = num2;
    }

    @Override
    protected void onPreExecute() {
        //do some changes on Num1 & Num2
    }


    @Override
    protected Void doInBackground(Void... voids) {
        //Use Num1 and Num2
    }
}

1 Ответ

0 голосов
/ 27 ноября 2018

Когда вы передаете примитивные переменные в константу асинхронной задачи, он передается по значению, поэтому любые изменения в num1 и num2 не отражаются в Num1 и Num2.Так что да, это нормально, если

1) Вы создаете другой поток внутри асинхронной задачи и изменяете Num1 и Num2 в этом потоке.Тогда вам придется объявить их энергозависимыми и использовать какие-то блокировки для ограничения доступа к асинхронной задаче и созданному потоку.

2) Вы получаете доступ и изменяете Num1 и Num2 в основном потоке пользовательского интерфейса, вызывая AsynTaskObj.Num1 или AsyncTaskObj.Num2.Та же ситуация, что и выше.

Я бы объявил Num1 и Num2 частными переменными для инкапсуляции.

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