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

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

Войти
Регистрация
Восстановить пароль
 
yura91
28 / 26 / 2
Регистрация: 23.10.2013
Сообщений: 2,218
#1

Синхронизация между потоками - Android

16.05.2016, 13:03. Просмотров 139. Ответов 18
Метки нет (Все метки)

Вот, например у меня есть основной Ui поток и поток Thread который он породил. И Tread меняет какую то переменную (ну или массив целый) и я хочу, чтобы об этих измениях узнал Ui поток. Ну понятно есть механизмы Handler там Broadcast и прочее. А как нибудь без них можно например обьявить переменную volatile там, опрашивать ее состояние через определенный промежуток времени в Ui потоке(ну там средства синхронизации могут помочь)? В ручную как нибудь можно это сделать без Handler, Broadcast там? или не стоит заморачиваться?
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
vxg
Модератор
3021 / 1823 / 189
Регистрация: 13.01.2012
Сообщений: 6,910
16.05.2016, 18:16     Синхронизация между потоками #2
yura91, можно все что угодно я к примеру делаю хандлер который раз в 0.5 с проверяет флажок сигнализирующий о завершении обработки
yura91
28 / 26 / 2
Регистрация: 23.10.2013
Сообщений: 2,218
16.05.2016, 18:37  [ТС]     Синхронизация между потоками #3
Ну это же handler а на уровне Thread как подобное можно реализовать?
YuraAAA
1564 / 1306 / 269
Регистрация: 25.10.2009
Сообщений: 3,424
Записей в блоге: 2
16.05.2016, 18:52     Синхронизация между потоками #4
yura91, слова "опрашивать с периодом времени" обычно наталкивают на мысль об ошибках проектирования. ИМХО, правильнее было бы callback
Паблито
16.05.2016, 19:02
  #5

Не по теме:

я несколько раз начинал писать сообщение про callback-и и observable поля, но останавливался )

yura91
28 / 26 / 2
Регистрация: 23.10.2013
Сообщений: 2,218
16.05.2016, 19:11  [ТС]     Синхронизация между потоками #6
Паблито, а можете хотя бы сейчас написать про эти поля? Мне бы интересно было бы узнать о них?
Паблито
2014 / 1756 / 546
Регистрация: 12.05.2014
Сообщений: 6,213
Завершенные тесты: 1
16.05.2016, 19:17     Синхронизация между потоками #7
Цитата Сообщение от YuraAAA Посмотреть сообщение
правильнее было бы callback
я тоже так думаю

Цитата Сообщение от yura91 Посмотреть сообщение
Мне бы интересно было бы узнать о них
https://www.google.com.ua/search?q=a...oid+observable
vxg
Модератор
3021 / 1823 / 189
Регистрация: 13.01.2012
Сообщений: 6,910
16.05.2016, 19:53     Синхронизация между потоками #8
Цитата Сообщение от YuraAAA Посмотреть сообщение
наталкивают на мысль об ошибках проектирования
карандаш работает и это гут) в свое время пытался найти серебряную пулю от того что из потока нельзя позвать форму. остановился на постоянно жужащем хандлере как на решении которое здесь и сейчас будет работать просто потому что там как то так и написано - для передачи используйте хандлер. так на том и остался. читал что то тут про обсервы и даже в свое время был восхищен но что то заставило оставить все как есть. видимо были причины не вспомнить уже)
Паблито
2014 / 1756 / 546
Регистрация: 12.05.2014
Сообщений: 6,213
Завершенные тесты: 1
16.05.2016, 20:05     Синхронизация между потоками #9
вся суть этих обсерверов - слушатели
тупо в класс передается ссылка на слушателя
как только рассчеты окончены - на слушателе дергается какой-то метод
и все )
vxg
Модератор
3021 / 1823 / 189
Регистрация: 13.01.2012
Сообщений: 6,910
16.05.2016, 20:30     Синхронизация между потоками #10
Паблито, это же андроид там все просто и все сложно в свое время мне половину головы оторвало только лишь от того что активити пересоздавалось из за поворота экрана или вообще из за того что так захотелось системе
YuraAAA
1564 / 1306 / 269
Регистрация: 25.10.2009
Сообщений: 3,424
Записей в блоге: 2
16.05.2016, 23:46     Синхронизация между потоками #11
vxg, Event Driven!

1. тред
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
public class SomeThread implements Runnable {
 
    private boolean changeableVariable;
 
    private void setChangeableVariable(boolean changeableVariable) {
        this.changeableVariable = changeableVariable;
        EventBus.getDefault().postSticky(changeableVariable);
    }
 
    @Override
    public void run() {
        for (;;) {
             setChangeableVariable(new Random().nextBoolean());
        }
    }
}
2. UI
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
public class TargetActivity extends Activity {
 
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        Executors.newSingleThreadExecutor().submit(new SomeThread());
    }
 
    @Subscribe(sticky = true, threadMode = ThreadMode.MAIN)
    public void onBooleanVariableChanged(boolean data) {
        
    }
}
На пересоздание активити - наплевать
vxg
Модератор
3021 / 1823 / 189
Регистрация: 13.01.2012
Сообщений: 6,910
17.05.2016, 07:37     Синхронизация между потоками #12
Цитата Сообщение от YuraAAA Посмотреть сообщение
На пересоздание активити - наплевать
модельная ситуация. создается активити, запускается поток, в потоке так или иначе сохраняется ссылка на активити для обратного вызова при завершении задачи. система убивает активити (например от поворота экрана или потому что ей так захотелось может памяти мало или еще чего - не знаю правда может ли она выгружать отдельные активити при нехватке без выгрузки приложения но не в этом суть) - система "убивает" ее, но на самом деле убить не может так как на нее есть ссылка из потока. после поворота экрана создается новое активити + у нас остается активити-зомби в которое придет обратный вызов и непонятно что там сделает с контролами-трупами...
Паблито
2014 / 1756 / 546
Регистрация: 12.05.2014
Сообщений: 6,213
Завершенные тесты: 1
17.05.2016, 10:01     Синхронизация между потоками #13
про пересоздание активити я уже писал - пересоздание можно отключать в манифесте
оно реально нужно только если для разных ориентаций используются разные файлы разметки, в этом случае пересоздание требуется что бы отработал onCreate вместе с setContentView()

даже если пересоздание было, спасают разные лоадеры, которые отслеживают изменение контекста
или вообще делать на ивентах
YuraAAA
1564 / 1306 / 269
Регистрация: 25.10.2009
Сообщений: 3,424
Записей в блоге: 2
17.05.2016, 10:44     Синхронизация между потоками #14
vxg, в моём примере нет этой ситуации. Правда, я забыл кое что)
В активити
onPause -> EventBus.getDefault().unregister(this);
onResume -> EventBus.getDefault().register(this);

Цитата Сообщение от Паблито Посмотреть сообщение
или вообще делать на ивентах
Вот вот
vxg
Модератор
3021 / 1823 / 189
Регистрация: 13.01.2012
Сообщений: 6,910
17.05.2016, 13:04     Синхронизация между потоками #15
Цитата Сообщение от Паблито Посмотреть сообщение
пересоздание можно отключать в манифесте
а что про убийство из за ресурсов? не в курсе может ли система не закрыв приложение убить одну из его фоновых активностей7

Добавлено через 2 минуты
Цитата Сообщение от YuraAAA Посмотреть сообщение
забыл кое что
да, теперь гораздо лучше. в моем велосипеде тоже хандлер стартует только когда запускается поток и останавливается если обнаружил что поток отработал или при паузе активити с последующем стартом при возобновлением если статическая переменная хранящая флаг отработки еще не выставлена. а на эвентах чем отличается от обратных вызовов?
YuraAAA
1564 / 1306 / 269
Регистрация: 25.10.2009
Сообщений: 3,424
Записей в блоге: 2
17.05.2016, 14:45     Синхронизация между потоками #16
vxg, статичные переменные это не самый лучший вариант. Слушателей эвентов может быть много.
Цитата Сообщение от vxg Посмотреть сообщение
не в курсе может ли система не закрыв приложение убить одну из его фоновых активностей7
Может, если она не видна. Но если у Вас в приложении много активити, это опять же повод задуматься о неверной архитектуре и о переходах на фрагменты.
vxg
Модератор
3021 / 1823 / 189
Регистрация: 13.01.2012
Сообщений: 6,910
17.05.2016, 14:50     Синхронизация между потоками #17
Цитата Сообщение от YuraAAA Посмотреть сообщение
статичные переменные это не самый лучший вариант
в описанном велосипеде это самое то
Цитата Сообщение от YuraAAA Посмотреть сообщение
если у Вас в приложении много активити, это опять же повод задуматься о неверной архитектуре и о переходах на фрагменты
я бы даже сказал: если у вас в приложении активити, это повод задуматься тем ли вы заняты)
YuraAAA
1564 / 1306 / 269
Регистрация: 25.10.2009
Сообщений: 3,424
Записей в блоге: 2
17.05.2016, 14:51     Синхронизация между потоками #18
vxg,
Цитата Сообщение от vxg Посмотреть сообщение
если у вас в приложении активити, это повод задуматься тем ли вы заняты)
в смысле?)
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
17.05.2016, 14:53     Синхронизация между потоками
Еще ссылки по теме:

Android Синхронизация баз данных на клиенте и сервере
Синхронизация приложения с сайтом Android
Android Работа с потоками (AsyncTask)
Работа с потоками Android
Android Передача данных между потоками

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

Или воспользуйтесь поиском по форуму:
vxg
17.05.2016, 14:53     Синхронизация между потоками
  #19

Не по теме:

Цитата Сообщение от YuraAAA Посмотреть сообщение
в смысле?)
в смысле андроид это конечно хорошо но комбайн в сарае и станок в цеху ржавеют

Yandex
Объявления
17.05.2016, 14:53     Синхронизация между потоками
Ответ Создать тему
Опции темы

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