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

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

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

Доступ к потоку из разных потоков - Android

30.05.2015, 16:06. Просмотров 168. Ответов 0
Метки нет (Все метки)

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
50
51
52
53
54
55
56
57
58
59
60
61
private Handler Ocnova = new Handler(); 
private Object sync = new Object();  private potok2 thread2 = null;
 
class potok2 extends Thread {
public boolean motion = false;
//...   
    public void run() {
        while(motion) {
            //...
        }
    }
}
class potok1 extends Thread {
//...String mes.....
   public void run() {
      while(true) {
         //.. socket.read(); // ждем пока не получим mes
         if("start".compareTo(mes) == 0) {
            synchronized(sync) { 
                Ocnova.post(new hand(this, mes)); // вот здесь работает коряво (Текст не отображает, как надо)
                try {sync.wait();} catch (InterruptedException e) {  }
            }
         }
         else if("stop".compareTo(mes) == 0) {
             synchronized(sync) {
                if (thread2 != null && thread2.isAlive() == true) { // если поток2 жив, останавливаем его (thread2 объявлен глобально)
                    thread2.motion = false; thread2.interrupt(); try{ thread2.join(3000); }catch(InterruptedException e){  } thread2 = null;
                }
            }
            break;
         }
      }
   }
}
//GUI-Thread
//...
if(условие) { new potok1().start(); }
//...
class hand implements Runnable {
    private potok1 thread1 = null; private String mes = null;
    public Potok4(potok1 thread1, String mes) {this.mes = mes; this.thread1 = thread1;}
    //...
    public void run() {
        synchronized(sync) {//ecли убрать отсюда thread2, все работает норм, когда же тут стоит thread2 тексты отоброжаются коряво.
            //... 
            if(всякие проверки, которые работаю только в gui) {
                if (thread2 == null || thread2.isAlive() == false) { // если поток2 не запущен, запускаем его (thread2 объявлен глобально)
                    tx1.setText("Поток2 не запущен, запускаем...");
                    thread2 = new potok2(); thread2.motion = true; thread2.start();
                }
                else {
                    tx1.setText("Поток2 уже работает");
                }
            }
            else {
                tx1.setText(mes);
            }
            sync.notify();
        }
   }
}
В общем есть "три" потока: gui-поток, potok1, potok2. Экземпляры класса potok1 запускаются в новом потоке из gui-потока. Экземпляр класса potok2 объявлен глобально, его нужно запускать в новом потоке из gui-потока, и останавливать из потока potok1.
Вот в чем проблема:
Из potok1 нам нужно обращаться к методам(гр. интерфейсу), которые работают только в GUI, поэтому использую Handler. Но даже, если использую Handler, текст коряво отображается или вовсе не отображается. Такое происходит только, если внутри класса hand находится thread2. Если его убрать из hand, все работает нормально. Но мне ведь нужно внутри hand делать манипуляции с thread2, например запустить его. В чем ошибка и как его устранить?
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
30.05.2015, 16:06     Доступ к потоку из разных потоков
Посмотрите здесь:

Android Размер изображения на разных телефонах
Android Ожидание завершения пула потоков
Доступ к базе данных из разных активити Android
Тонкости потоков Android
Android Обращение из сервиса к основному (UI) потоку
Android ExpandableListView на разных API
Не отображается AlertDialog на разных устройствах Android
Android Разные стили для разных тем
Android По разному отображается на разных устройствах
Dimens для разных экранов Android
По-разному работает на разных телефонах Android
Как сравнить две разных БД Android

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

Или воспользуйтесь поиском по форуму:
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Ответ Создать тему
Опции темы

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