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

Программирование Android

Войти
Регистрация
Восстановить пароль
 
Serbis
7 / 7 / 2
Регистрация: 13.07.2012
Сообщений: 127
#1

Не запускается AsyncTask - Программирование Android

01.03.2015, 16:53. Просмотров 319. Ответов 0
Метки нет (Все метки)

Вот такая вот проблема. Имеется такая вот довольно сложная архитектура. В 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);
Стоило изложить проблему в письменно виде и она сразу же решается сама собой, и так уже не первый раз...
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
01.03.2015, 16:53
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Не запускается AsyncTask (Программирование Android):

AsyncTask - Программирование Android
Привет. Знаю, что в AsyncTask doInBackground() обращатся к компонентам UI нельзя. Когда я пытаюсь обновить вывод (в EditText) в...

AsyncTask и get() - Программирование Android
Создаю асинхронный процесс, где в onPreExecute() запускаю анимированный ProgressDialog. После выполнения задачи нужно выполнить действия....

AsyncTask - Программирование Android
Здравствуйте, при использовании двух одинаковых методов получается разный результат. AsyncTask в одном случае успешно передает данные в...

AsyncTask - Программирование Android
Использую AsyncTasc class MyT extends AsyncTask&lt;Void, Void, Void&gt; { @Override protected Void doInBackground(Void......

AsyncTask+CheckBox - Программирование Android
Здравствуйте, интересует вопрос нужно в функцию AsyncTask послать несколько строк, в зависимости какие Чекбоксы чекнуты. Ну например: ...

AsyncTask и SQLite - Программирование Android
Здравствуйте! У меня в приложении есть БД SQLite, при нажатие на кнопку загрузки, приложение начинает в базу вносить записи. Структура...

0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
01.03.2015, 16:53
Привет! Вот еще темы с ответами:

AsyncTask и Jsoup - Программирование Android
Не работает вот такой код: package com.example.projecta; import org.jsoup.Jsoup; import org.jsoup.nodes.Document; import...

AsyncTask тормозит - Программирование Android
Подскажите пожалуйста, делалю загрузку данных с сервера через asyncTask и возвращаются результат, а дальше делаю обработку этих данных во...

Работа с AsyncTask - Программирование Android
Попробовал использовать AsyncTask и возник вопрос. У меня есть несколько ф-й, которые парсят текстовые файлы и заполняют таблицы БД. ...

Не работает AsyncTask - Программирование Android
Не работает AsyncTask , вот код: private void registerInBackground() { new AsyncTask() { @Override ...


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

Или воспользуйтесь поиском по форуму:
1
Ответ Создать тему
Опции темы

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