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

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

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

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

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

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

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

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

Работа с потоками - Программирование Android
Программа: парсер, по нажатию на кнопку, она начинает свою работу (конечно же в отдельном потоке). Получив данные с сайта, нам нужно эти...

Не могу разобраться с потоками - Программирование Android
Здравствуйте. Никак не могу понять принцип выноса задач в отдельный поток. Смысл прост: 1)есть метод который обновляет адаптер для...

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

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

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

После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
vxg
Модератор
3138 / 1940 / 214
Регистрация: 13.01.2012
Сообщений: 7,428
16.05.2016, 18:16     Синхронизация между потоками #2
yura91, можно все что угодно я к примеру делаю хандлер который раз в 0.5 с проверяет флажок сигнализирующий о завершении обработки
yura91
29 / 27 / 2
Регистрация: 23.10.2013
Сообщений: 2,238
16.05.2016, 18:37  [ТС]     Синхронизация между потоками #3
Ну это же handler а на уровне Thread как подобное можно реализовать?
YuraAAA
1567 / 1309 / 269
Регистрация: 25.10.2009
Сообщений: 3,424
Записей в блоге: 2
16.05.2016, 18:52     Синхронизация между потоками #4
yura91, слова "опрашивать с периодом времени" обычно наталкивают на мысль об ошибках проектирования. ИМХО, правильнее было бы callback
Pablito
16.05.2016, 19:02
  #5

Не по теме:

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

yura91
29 / 27 / 2
Регистрация: 23.10.2013
Сообщений: 2,238
16.05.2016, 19:11  [ТС]     Синхронизация между потоками #6
Паблито, а можете хотя бы сейчас написать про эти поля? Мне бы интересно было бы узнать о них?
Pablito
2452 / 1897 / 590
Регистрация: 12.05.2014
Сообщений: 6,698
Завершенные тесты: 1
16.05.2016, 19:17     Синхронизация между потоками #7
Цитата Сообщение от YuraAAA Посмотреть сообщение
правильнее было бы callback
я тоже так думаю

Цитата Сообщение от yura91 Посмотреть сообщение
Мне бы интересно было бы узнать о них
https://www.google.com.ua/search?q=a...oid+observable
vxg
Модератор
3138 / 1940 / 214
Регистрация: 13.01.2012
Сообщений: 7,428
16.05.2016, 19:53     Синхронизация между потоками #8
Цитата Сообщение от YuraAAA Посмотреть сообщение
наталкивают на мысль об ошибках проектирования
карандаш работает и это гут) в свое время пытался найти серебряную пулю от того что из потока нельзя позвать форму. остановился на постоянно жужащем хандлере как на решении которое здесь и сейчас будет работать просто потому что там как то так и написано - для передачи используйте хандлер. так на том и остался. читал что то тут про обсервы и даже в свое время был восхищен но что то заставило оставить все как есть. видимо были причины не вспомнить уже)
Pablito
2452 / 1897 / 590
Регистрация: 12.05.2014
Сообщений: 6,698
Завершенные тесты: 1
16.05.2016, 20:05     Синхронизация между потоками #9
вся суть этих обсерверов - слушатели
тупо в класс передается ссылка на слушателя
как только рассчеты окончены - на слушателе дергается какой-то метод
и все )
vxg
Модератор
3138 / 1940 / 214
Регистрация: 13.01.2012
Сообщений: 7,428
16.05.2016, 20:30     Синхронизация между потоками #10
Паблито, это же андроид там все просто и все сложно в свое время мне половину головы оторвало только лишь от того что активити пересоздавалось из за поворота экрана или вообще из за того что так захотелось системе
YuraAAA
1567 / 1309 / 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
Модератор
3138 / 1940 / 214
Регистрация: 13.01.2012
Сообщений: 7,428
17.05.2016, 07:37     Синхронизация между потоками #12
Цитата Сообщение от YuraAAA Посмотреть сообщение
На пересоздание активити - наплевать
модельная ситуация. создается активити, запускается поток, в потоке так или иначе сохраняется ссылка на активити для обратного вызова при завершении задачи. система убивает активити (например от поворота экрана или потому что ей так захотелось может памяти мало или еще чего - не знаю правда может ли она выгружать отдельные активити при нехватке без выгрузки приложения но не в этом суть) - система "убивает" ее, но на самом деле убить не может так как на нее есть ссылка из потока. после поворота экрана создается новое активити + у нас остается активити-зомби в которое придет обратный вызов и непонятно что там сделает с контролами-трупами...
Pablito
2452 / 1897 / 590
Регистрация: 12.05.2014
Сообщений: 6,698
Завершенные тесты: 1
17.05.2016, 10:01     Синхронизация между потоками #13
про пересоздание активити я уже писал - пересоздание можно отключать в манифесте
оно реально нужно только если для разных ориентаций используются разные файлы разметки, в этом случае пересоздание требуется что бы отработал onCreate вместе с setContentView()

даже если пересоздание было, спасают разные лоадеры, которые отслеживают изменение контекста
или вообще делать на ивентах
YuraAAA
1567 / 1309 / 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
Модератор
3138 / 1940 / 214
Регистрация: 13.01.2012
Сообщений: 7,428
17.05.2016, 13:04     Синхронизация между потоками #15
Цитата Сообщение от Паблито Посмотреть сообщение
пересоздание можно отключать в манифесте
а что про убийство из за ресурсов? не в курсе может ли система не закрыв приложение убить одну из его фоновых активностей7

Добавлено через 2 минуты
Цитата Сообщение от YuraAAA Посмотреть сообщение
забыл кое что
да, теперь гораздо лучше. в моем велосипеде тоже хандлер стартует только когда запускается поток и останавливается если обнаружил что поток отработал или при паузе активити с последующем стартом при возобновлением если статическая переменная хранящая флаг отработки еще не выставлена. а на эвентах чем отличается от обратных вызовов?
YuraAAA
1567 / 1309 / 269
Регистрация: 25.10.2009
Сообщений: 3,424
Записей в блоге: 2
17.05.2016, 14:45     Синхронизация между потоками #16
vxg, статичные переменные это не самый лучший вариант. Слушателей эвентов может быть много.
Цитата Сообщение от vxg Посмотреть сообщение
не в курсе может ли система не закрыв приложение убить одну из его фоновых активностей7
Может, если она не видна. Но если у Вас в приложении много активити, это опять же повод задуматься о неверной архитектуре и о переходах на фрагменты.
vxg
Модератор
3138 / 1940 / 214
Регистрация: 13.01.2012
Сообщений: 7,428
17.05.2016, 14:50     Синхронизация между потоками #17
Цитата Сообщение от YuraAAA Посмотреть сообщение
статичные переменные это не самый лучший вариант
в описанном велосипеде это самое то
Цитата Сообщение от YuraAAA Посмотреть сообщение
если у Вас в приложении много активити, это опять же повод задуматься о неверной архитектуре и о переходах на фрагменты
я бы даже сказал: если у вас в приложении активити, это повод задуматься тем ли вы заняты)
YuraAAA
1567 / 1309 / 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
Допустим, есть приложение, данные для которого берутся из API сайта. Соответственно, данные на сайте периодически обновляются. Вопрос!...

Синхронизация Android и ПК на Java - Программирование Android
Здравствуйте уважаемые форумчане. Я студентка и только начинаю изучать Java. Преподаватель предложил в качестве курсовой написать на...

Синхронизация приложения и сервера - Программирование Android
Всем привет. Пишу сервер для своего андроид приложения и возникло 2 вопроса по поводу синхронизации. 1. И так... Для примера...

SQLite синхронизация с MySQL - Программирование Android
Здравствуйте! Подскажите пожалуйста если кто то сталкивался как синхронизировать базу данных SQLite на андроиде и MySQL на сервере. ...

Синхронизация Spinner и Listview - Программирование Android
Есть спиннер со списком сайтов, который получен в виде json ArrayList<HashMap<String, String>> siteList; List<String>...


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

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

Не по теме:

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

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

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