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

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

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

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

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

Абстрактное наследование от AsyncTask - Программирование Android
Нужно реализовать иерархию наследования от AsyncTask. Цель - переопределить метод. Как в Java реализуется шаблонное наследование ? ...

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

Работа с потоками (AsyncTask) - Программирование Android
Здравствуйте. Мне нужно отослать post запрос на сервер, но так как грузить GUI нельзя (что и логично) - обволакиваю весь код работы с...

AsyncTask и чтение XML - Программирование Android
Написал следущее: Но после нажатия на кнопку таск подвисает и через пару секунд приложение аварийно закрывается. ощибки из лога в...

ArrayList не заполняется в AsyncTask - Программирование Android
Здравствуйте. В asyncTask есть такой код: String s = elements.get(0).text().split(&quot;: &quot;); Log.d(&quot;1&quot;,s); ...

Dropbox: syncNowAndWait в AsyncTask - Программирование Android
В doInBackground() выгружаю данные на Dropbox, отображая ProgressDialog. По кнопке Cancel (в диалоге) срабатывает событие onCancelled(). ...

Как остановить AsyncTask? - Программирование Android
Не ругайтесь на код:) с Asynctask работаю только несколько дней class MyTask extends AsyncTask&lt;Void, Void, Void&gt; { @Override...

Запуск нескольких AsyncTask - Программирование Android
Есть ListView там чекбоксы, при нажатии на чекбох запускается поток.. AsyncTaskWASAQ task = new AsyncTaskWASAQ(); task.execute(); ...

Вылетает setadapter в AsyncTask - Программирование Android
Добрый день, получаю xml от сервера с неким списком произведения и пытаюсь занести данные в listview. По факту данные заносятся в p.name...

AsyncTask в Fragment и viewPager - Программирование Android
У меня есть ViewPager который состоит из двух листающихся экранов, есть код фрагмента который запускается в этом viewPager (как правильно...


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

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

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