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

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

Войти
Регистрация
Восстановить пароль
 
rugga
0 / 0 / 0
Регистрация: 10.02.2014
Сообщений: 71
#1

Потоки (Handler внутри synchronized) - Программирование Android

29.05.2015, 16:05. Просмотров 425. Ответов 6
Метки нет (Все метки)

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
private Handler Ocnova = new Handler();
private Object sync = new Object();
 
class newThread extends Thread {
//...String mes.....
//...
   public void run() {
      while(true) {
         //.. socket.read(); // ждем пока не получим mes
         if("start".compareTo(mes) == 0) {
            synchronized(sync) {
               Ocnova.post(new Potok4(this, mes));
               try {sync.wait(); } catch (InterruptedException e) {  }
            }
         }
         else if("stop".compareTo(mes) == 0) {
            break;
         }
      }
   }
}
 
//GUI-Thread
//...
class Potok4 implements Runnable {
   private newThread threadNEW = null; private String mes = null;
   public Potok4(newThread threadNEW, String mes) {this.mes = mes;}
   //...
   synchronized(sync) {
      //...
      txt.setText(mes);
      sync.notify();
   }
}
Потоков newThread может быть очень много, поэтому synchronized. При отправки из newThread Handler-а, в Runnable(Potok4) выполняется не все, что там находится. Например setText срабатывает на раз. При этом, если поток newThread выходит из run(), все, что было внутри Potok4 тут же срабатывает (все тексты отображаются). Из-за чего такое может быть? Можно ли внутри synchronized вызывать Handler? Как быть, если нужно синхронизированно обращаться из других потоков к методам, которые работают только в gui-потоке?
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
29.05.2015, 16:05     Потоки (Handler внутри synchronized)
Посмотрите здесь:

Модификатор synchronized и Runnable - Программирование Android
Имеется сервис в котором крутится поток работающий с сетью, проблема в том, что при некоторых(больше месяца пытаюсь понять каких)...

Handler - Программирование Android
Вот допустим обьект Handler был создан в активити(то есть в главном потоке). И мы запускаем через этот Handler (его метод post) кусок кода...

Handler - Программирование Android
import android.app.Activity; import android.os.Bundle; import android.os.Handler; import android.os.Message; import...

Не работает Handler - Программирование Android
Я нахожусь на 66 уроке startandroid, здесь упоминается Handler. Почему то отсутствуют у меня методы, которые описываются тут. Вот фрагмент...

Handler timer - Программирование Android
Добрый вечер. С помощью какого метода в Handler http://developer.android.com/reference/android/os/Handler.html(беда пока с английским) ,...

Handler и интервал времени - Программирование Android
Создаю хэндлер: Handler h = new Handler(); h.post(obrtimer); Runnable obrtimer = new Runnable() { public void run() { ...

Handler vs Service vs AsynkTask - Программирование Android
Есть 2 Activity, пусть A1 и A2. В методе onCreate() Activity A1 запускается новый поток, в котором определяются координаты местоположения...

После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Welemir1
Мечтатель
318 / 294 / 102
Регистрация: 30.03.2015
Сообщений: 1,285
29.05.2015, 16:13     Потоки (Handler внутри synchronized) #2
Я верно понимаю, что у вас некая графическая форма есть в программе, возможно даже Свинг, в которой элементы не отображаются когда должны, но прорисовываются, когда заканчивается определенный поток?
rugga
0 / 0 / 0
Регистрация: 10.02.2014
Сообщений: 71
29.05.2015, 16:18  [ТС]     Потоки (Handler внутри synchronized) #3
Да, когда с gui-потока меняешь форму, все отображается, а вот с др. потока, если обращаться как я указал в коде иногда отображает, иногда нет. Когда заканчивается поток, всегда отображает все, что должно.
В примере я забыл в Potok4 добавить run(), но он там есть.
Welemir1
Мечтатель
318 / 294 / 102
Регистрация: 30.03.2015
Сообщений: 1,285
29.05.2015, 16:23     Потоки (Handler внутри synchronized) #4
это все из-за правила единственного потока для Свинг. Нужно все изменения формы и саму форму рисовать в основном диспетчере потоков (а не в созданных новых потоках), вычисления же и прочее вести в других потоках. Изменения формы производить не просто присваиванием, а через invokeLater, так нормально отрабатывает. Хотя сами производители указали что Свинг не потокобезопасен.
Тем не менее, моя программа выполненная по этому правилу вполне себе работает и к примеру в выпадающий список выдает подключившихся юзеров и убирает отключившихся без проблем в отображении.
rugga
0 / 0 / 0
Регистрация: 10.02.2014
Сообщений: 71
29.05.2015, 16:37  [ТС]     Потоки (Handler внутри synchronized) #5
Я пишу под android, а там вроде нет свингов?
Welemir1
Мечтатель
318 / 294 / 102
Регистрация: 30.03.2015
Сообщений: 1,285
29.05.2015, 17:03     Потоки (Handler внутри synchronized) #6
я же тебя спросил про свинг))) тогда беру свои слова назад)
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
29.05.2015, 18:53     Потоки (Handler внутри synchronized)
Еще ссылки по теме:

Handler, поток не останавливается - Программирование Android
Добрый вечер. Не могу остановить таймер, при переходе на другую Activity. Возможно ли это вообще? Code: mport...

Про Handler и ProgressBar - Программирование Android
Есть 2 кнопки - Start и Stop, соответственно запуск и остановка прогресса в ProgressBar, запуск каждый раз идет с нуля. Если нажать...

Работа с Handler из другого активити - Программирование Android
Здравствуйте, пишу чат приложение и не могу понять как можно обрабатывать входящие сообщение из другого активити. У меня есть форма...

Handler при пересоздании активити - Программирование Android
У меня есть поток Thread, который запускается во фрагменте и получает ссылку на изображение с сервера(парсит JSON выделяет ссылку). И...

Передача сообщения из потока. Handler - Программирование Android
Добрый день, пытаюсь передать сообщение через Handler из потока, для обновления textView, но программа вылетает при присвоении значения...


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

Или воспользуйтесь поиском по форуму:
Pablito
2414 / 1859 / 583
Регистрация: 12.05.2014
Сообщений: 6,596
Завершенные тесты: 1
29.05.2015, 18:53     Потоки (Handler внутри synchronized) #7
я может как обычно невнимательно прочитал код, но все логично - захватили монитор, внутри блока запустили новый Thread, который ждет пока монитор освободят
Yandex
Объявления
29.05.2015, 18:53     Потоки (Handler внутри synchronized)
Ответ Создать тему
Опции темы

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