Форум программистов, компьютерный форум, киберфорум
Наши страницы
Программирование Android
Войти
Регистрация
Восстановить пароль
 
yura91
1 / 25 / 2
Регистрация: 23.10.2013
Сообщений: 2,326
1

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

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

Вот, например у меня есть основной Ui поток и поток Thread который он породил. И Tread меняет какую то переменную (ну или массив целый) и я хочу, чтобы об этих измениях узнал Ui поток. Ну понятно есть механизмы Handler там Broadcast и прочее. А как нибудь без них можно например обьявить переменную volatile там, опрашивать ее состояние через определенный промежуток времени в Ui потоке(ну там средства синхронизации могут помочь)? В ручную как нибудь можно это сделать без Handler, Broadcast там? или не стоит заморачиваться?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
16.05.2016, 13:03
Ответы с готовыми решениями:

Передача данных между потоками
Всем доброго времени суток. В общем есть приложение, которое парсит сайт с...

EventBus и обмен событиями между потоками
Допустим у меня есть один фоновый thread и второй. Могу ли я через eventBus...

Синхронизация данных приложения между устройствами
Здравствуйте! Необходимо осуществить синхронизацию данных приложения на разных...

Работа с потоками
Программа: парсер, по нажатию на кнопку, она начинает свою работу (конечно же в...

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

18
vxg
Модератор
3252 / 2052 / 323
Регистрация: 13.01.2012
Сообщений: 7,950
16.05.2016, 18:16 2
yura91, можно все что угодно я к примеру делаю хандлер который раз в 0.5 с проверяет флажок сигнализирующий о завершении обработки
0
yura91
1 / 25 / 2
Регистрация: 23.10.2013
Сообщений: 2,326
16.05.2016, 18:37  [ТС] 3
Ну это же handler а на уровне Thread как подобное можно реализовать?
0
YuraAAA
1578 / 1319 / 282
Регистрация: 25.10.2009
Сообщений: 3,436
Записей в блоге: 2
16.05.2016, 18:52 4
yura91, слова "опрашивать с периодом времени" обычно наталкивают на мысль об ошибках проектирования. ИМХО, правильнее было бы callback
2
Pablito
16.05.2016, 19:02
  #5

Не по теме:

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

0
yura91
1 / 25 / 2
Регистрация: 23.10.2013
Сообщений: 2,326
16.05.2016, 19:11  [ТС] 6
Паблито, а можете хотя бы сейчас написать про эти поля? Мне бы интересно было бы узнать о них?
1
Pablito
2731 / 2166 / 735
Регистрация: 12.05.2014
Сообщений: 7,583
Завершенные тесты: 1
16.05.2016, 19:17 7
Цитата Сообщение от YuraAAA Посмотреть сообщение
правильнее было бы callback
я тоже так думаю

Цитата Сообщение от yura91 Посмотреть сообщение
Мне бы интересно было бы узнать о них
https://www.google.com.ua/search?q=a...oid+observable
1
vxg
Модератор
3252 / 2052 / 323
Регистрация: 13.01.2012
Сообщений: 7,950
16.05.2016, 19:53 8
Цитата Сообщение от YuraAAA Посмотреть сообщение
наталкивают на мысль об ошибках проектирования
карандаш работает и это гут) в свое время пытался найти серебряную пулю от того что из потока нельзя позвать форму. остановился на постоянно жужащем хандлере как на решении которое здесь и сейчас будет работать просто потому что там как то так и написано - для передачи используйте хандлер. так на том и остался. читал что то тут про обсервы и даже в свое время был восхищен но что то заставило оставить все как есть. видимо были причины не вспомнить уже)
0
Pablito
2731 / 2166 / 735
Регистрация: 12.05.2014
Сообщений: 7,583
Завершенные тесты: 1
16.05.2016, 20:05 9
вся суть этих обсерверов - слушатели
тупо в класс передается ссылка на слушателя
как только рассчеты окончены - на слушателе дергается какой-то метод
и все )
1
vxg
Модератор
3252 / 2052 / 323
Регистрация: 13.01.2012
Сообщений: 7,950
16.05.2016, 20:30 10
Паблито, это же андроид там все просто и все сложно в свое время мне половину головы оторвало только лишь от того что активити пересоздавалось из за поворота экрана или вообще из за того что так захотелось системе
0
YuraAAA
1578 / 1319 / 282
Регистрация: 25.10.2009
Сообщений: 3,436
Записей в блоге: 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) {
        
    }
}
На пересоздание активити - наплевать
1
vxg
Модератор
3252 / 2052 / 323
Регистрация: 13.01.2012
Сообщений: 7,950
17.05.2016, 07:37 12
Цитата Сообщение от YuraAAA Посмотреть сообщение
На пересоздание активити - наплевать
модельная ситуация. создается активити, запускается поток, в потоке так или иначе сохраняется ссылка на активити для обратного вызова при завершении задачи. система убивает активити (например от поворота экрана или потому что ей так захотелось может памяти мало или еще чего - не знаю правда может ли она выгружать отдельные активити при нехватке без выгрузки приложения но не в этом суть) - система "убивает" ее, но на самом деле убить не может так как на нее есть ссылка из потока. после поворота экрана создается новое активити + у нас остается активити-зомби в которое придет обратный вызов и непонятно что там сделает с контролами-трупами...
0
Pablito
2731 / 2166 / 735
Регистрация: 12.05.2014
Сообщений: 7,583
Завершенные тесты: 1
17.05.2016, 10:01 13
про пересоздание активити я уже писал - пересоздание можно отключать в манифесте
оно реально нужно только если для разных ориентаций используются разные файлы разметки, в этом случае пересоздание требуется что бы отработал onCreate вместе с setContentView()

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

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

Добавлено через 2 минуты
Цитата Сообщение от YuraAAA Посмотреть сообщение
забыл кое что
да, теперь гораздо лучше. в моем велосипеде тоже хандлер стартует только когда запускается поток и останавливается если обнаружил что поток отработал или при паузе активити с последующем стартом при возобновлением если статическая переменная хранящая флаг отработки еще не выставлена. а на эвентах чем отличается от обратных вызовов?
0
YuraAAA
1578 / 1319 / 282
Регистрация: 25.10.2009
Сообщений: 3,436
Записей в блоге: 2
17.05.2016, 14:45 16
vxg, статичные переменные это не самый лучший вариант. Слушателей эвентов может быть много.
Цитата Сообщение от vxg Посмотреть сообщение
не в курсе может ли система не закрыв приложение убить одну из его фоновых активностей7
Может, если она не видна. Но если у Вас в приложении много активити, это опять же повод задуматься о неверной архитектуре и о переходах на фрагменты.
1
vxg
Модератор
3252 / 2052 / 323
Регистрация: 13.01.2012
Сообщений: 7,950
17.05.2016, 14:50 17
Цитата Сообщение от YuraAAA Посмотреть сообщение
статичные переменные это не самый лучший вариант
в описанном велосипеде это самое то
Цитата Сообщение от YuraAAA Посмотреть сообщение
если у Вас в приложении много активити, это опять же повод задуматься о неверной архитектуре и о переходах на фрагменты
я бы даже сказал: если у вас в приложении активити, это повод задуматься тем ли вы заняты)
0
YuraAAA
1578 / 1319 / 282
Регистрация: 25.10.2009
Сообщений: 3,436
Записей в блоге: 2
17.05.2016, 14:51 18
vxg,
Цитата Сообщение от vxg Посмотреть сообщение
если у вас в приложении активити, это повод задуматься тем ли вы заняты)
в смысле?)
0
vxg
17.05.2016, 14:53     Синхронизация между потоками
  #19

Не по теме:

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

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

Не могу разобраться с потоками
Здравствуйте. Никак не могу понять принцип выноса задач в отдельный поток....

Работа с потоками при переключении Activity
Если в одной из Activity вызвать поток, в котором будет бесконечный цикл(т.е....

Синхронизация задач
есть 2 независимые задачи. Обе должны получать доступ к модулю wifi. Каждая из...


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

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

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