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

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

Войти
Регистрация
Восстановить пароль
Другие темы раздела
Программирование Android Нужна помощь в разработке умного дома http://www.cyberforum.ru/android-dev/thread1385254.html
В общем вопрос такой:"Как сделать так, чтобы когда в этой строке(129):Speech.setText("Вы сказали: " +matches_text.get(position)); выводится "Вы сказали: 1" то система передаёт данные по блютус таким...
Программирование Android данные приложения Есть некоторые данные приложения типа картинок и текстовых файлов, необходимо что бы они устанавливались автоматически вместе с приложением. Я так понимаю их необходимо закидывать в папку res и там... http://www.cyberforum.ru/android-dev/thread1385253.html
Реализация диалога android Программирование Android
Доброго времени суток. Решил написать простенький месседжер, и столкнулся с такой проблемой: Не знаю как это называется и как такое реализовать. Диалог между пользователями, как в вк или любом...
Самодельный File Explorer Программирование Android
Для более менее окончания проекта осталось пройти еще один квест. Написать самодельный File Explorer. Есть Активити1 при нажатии на кнопку, переходим в Активити2. Активити2 представляет из себя...
Программирование Android Куда вставить готовый код в программе Android Studio? http://www.cyberforum.ru/android-dev/thread1385213.html
Вставил код из "Урок 58" ссылка - http://startandroid.ru/ru/uroki/vse-uroki-spiskom/117-urok-58-dialogi-timepickerdialog.html как теперь в этот код добавить "Урок 59" ссылка -...
Программирование Android Вращение барабана слот машины Здравствуй, уважаемый формучанин. Делаю слот машину. Застрял на анимации вращения барабана (пример на скрине). Барабан состоит из 3 ячеек. Пробовал через ViewFlipper анимацию каждой ячейки по... подробнее

Показать сообщение отдельно
Serbis
7 / 7 / 2
Регистрация: 13.07.2012
Сообщений: 127

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

01.03.2015, 16:53. Просмотров 320. Ответов 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
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
 
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru