Форум программистов, компьютерный форум CyberForum.ru

Не запускается AsyncTask - Android

Восстановить пароль Регистрация
 
Serbis
3 / 3 / 2
Регистрация: 13.07.2012
Сообщений: 121
01.03.2015, 16:53     Не запускается AsyncTask #1
Вот такая вот проблема. Имеется такая вот довольно сложная архитектура. В Main_Activity объявлены экземпляры всех существующих классов. Отсюда же вызывается метод ParceCommand.start которые открывает новый поток и ждет от сервера команды, дождавшись вызывает функцию определения команды ParceCommand.processCommand, которая определив команду вызывает необходимую функцию, именно Core.set_geoloc_state, которая должна на основании настроек запустить SendGeoloc.start, в котором вызывается поток для цикличной отправки данных на сервер. Проблема в том, что запуск последнего потока игнорируется, но если вызвать метод Core.set_geoloc_state из главного класса все работает. Попахивает какой-то зависимостью, но я не могу понять какой. Код привожу максимально упрощенным.

Main_Acitivity
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
public class MainActivity extends ActionBarActivity {
    public ParceCommand parcer;
    public static Core core;
    public static SendGeoloc sendGeoloc;
 
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
 
        sendGeoloc = new SendGeoloc();
        core = new Core();
        parcer = new ParceCommand();
        parcer.start();
 
    }
}
ParceCommand
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
public class ParceCommand {
    public WaitCommand waitCommand;
 
    public ParceCommand() {
 
    }
 
    public void start() {
        waitCommand = new WaitCommand();
        waitCommand.execute();
    }
 
    private void processCommand(String command) {
                //Обрабатывает команду и вызывает подлежащий метод
                MainActivity.core.set_geoloc_state();
 
        }
    }
 
    class WaitCommand extends AsyncTask<Void, String, Void> {
 
        @Override
        protected Void doInBackground(Void... params) {
            int a = 0;      //Переменная для обхода проверки компилятора на бесконечный цикл
 
            while (true) {
                if (isCancelled()) break;
                    //Тут получаем от сервера команду и выводим ее через onProgressUpdate
                    publishProgress(command);
                }
 
                if (a==1) break;
            }
 
            return null;
        }
 
        @Override
        protected void onProgressUpdate(String... values) {
            super.onProgressUpdate(values);
            processCommand(values[0]);
        }
 
        @Override
        protected void onCancelled() {
            super.onCancelled();
        }
 
    };
Java
1
2
3
4
5
6
7
8
9
10
public class Core {
 
    public Core() {
       
 
    }
 
    public void set_geoloc_state(boolean state) {
        MainActivity.sendGeoloc.start();     //запускаем отправку геоднанных
    }
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
public class SendGeoloc {
    private SendCurrentGeoloc sendCurrentGeoloc;
 
    public SendGeoloc() {
        sendCurrentGeoloc = new SendCurrentGeoloc();
    }
 
    public void start() {
        sendCurrentGeoloc.execute();
    }
 
  class SendCurrentGeoloc extends AsyncTask<Void, String, Void> {
 
        @Override
        protected Void doInBackground(Void... params) {
            int a = 0;      //Переменная для обхота проверки компилятора на бесконечный циел
 
            while (true) {
                if (isCancelled()) break;
                
                //Тут внутренности потока
                
                if (a==1) break;
            }
 
            return null;
        }
 
 
        @Override
        protected void onCancelled() {
            super.onCancelled();
        }
 
    };
Добавлено через 11 минут
Ага, нашел, запрет на выполнение параллельных потоков. Т. е. получается что бы запустить последний поток, нужно сначала дождаться завершения первого, а этого невозможно, так как он же этот вызов и породил. Теперь вопрос, как в таком случае применить executeOnExecutor.

Добавлено через 5 минут
Все, проблема решена вызовом

Java
1
sendCurrentGeoloc.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR);
Стоило изложить проблему в письменно виде и она сразу же решается сама собой, и так уже не первый раз...
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
01.03.2015, 16:53     Не запускается AsyncTask
Посмотрите здесь:

Android AsyncTask+CheckBox
Android Exception в AsyncTask
Android AsyncTask и Jsoup
Android Работа с AsyncTask
Android AsyncTask
Android AsyncTask и get()
AsyncTask Android
Android Отмена AsyncTask
AsyncTask Android
Android AsyncTask тормозит
Android Не работает AsyncTask
MainActivity AsyncTask Android

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Ответ Создать тему
Опции темы

Текущее время: 23:26. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru