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

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

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

ошибка calledfromwrongthreadexception - Android

19.01.2014, 04:53. Просмотров 529. Ответов 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
public class Receive implements Runnable
{
    public void run()
    {
while(true)
        {
         
         try 
         {
            
             byte[] mybytearray = new byte[1024];
             InputStream is = MainActivity.client.getInputStream(); 
            
             int bytesRead = is.read(mybytearray, 0, mybytearray.length);
            
            if(bytesRead>=1)
            {
                String dan = new String( mybytearray, 0,bytesRead);
                    Stack_1.R.push(dan);
                    }
         }
         catch (IOException e) {}   
       }
    }
    }
потом я в таймере принимаю
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
 public void r()
      {
          timer.schedule(new YourTimerTask(), 0, 1000);
      }
      public class YourTimerTask extends TimerTask
      {
          @Override
        public void run() 
        {
            if(Stack_1.R.empty()==false)
            {
                String person=Stack_1.R.pop();
                r2(person);
                Stack_1.R.clear();
                timer.cancel();
            }
        }
        
      }
      public void r2(String text)
      {
          te.setText(text);
      }
и у меня ошибка android.view.ViewRoot$CalledFromWrongThreadException
как так? ошибка видно когда я делаю te.setText(text); или r2(person);
я не могу изменять текст в элементах ? или как это обойти

Добавлено через 8 минут
или не могу изменять из за потока или за чего ,или из за другого потока,как решить
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
angryrobot
Командир зеленых роботов
346 / 283 / 53
Регистрация: 08.10.2013
Сообщений: 564
19.01.2014, 13:19     ошибка calledfromwrongthreadexception #2
Цитата Сообщение от TRIUMF Посмотреть сообщение
или не могу изменять из за потока или за чего ,или из за другого потока,как решить
Взаимодействие с компонентами графического интерфейса осуществляется только из главного потока, в противном случае возникнет эта ошибка о которой вы писали.
Цитата Сообщение от TRIUMF Посмотреть сообщение
как это обойти
Есть несколько способов. Например можно так:
Java
1
2
3
4
5
6
7
        te.post(new Runnable() {
            @Override
            public void run() {
                //это всегда выполняется в главном потоке
                te.setText("test");
            }
        });
TRIUMF
1 / 1 / 0
Регистрация: 14.03.2013
Сообщений: 103
19.01.2014, 15:51  [ТС]     ошибка calledfromwrongthreadexception #3
angryrobot, это мне теперь в методе писать
Java
1
2
3
4
5
6
7
8
9
10
11
      public void r2(final String text)
      {
          te.post(new Runnable() {
                @Override
                public void run() {
                    //это всегда выполняется в главном потоке
                    te.setText(text);
                }
            });
      }
      }
так что ли?

Добавлено через 15 секунд
angryrobot, это мне теперь в методе писать
Java
1
2
3
4
5
6
7
8
9
10
11
      public void r2(final String text)
      {
          te.post(new Runnable() {
                @Override
                public void run() {
                    //это всегда выполняется в главном потоке
                    te.setText(text);
                }
            });
      }
      }
так что ли?

Добавлено через 52 секунды
angryrobot, а какие есть ещё способы
angryrobot
Командир зеленых роботов
346 / 283 / 53
Регистрация: 08.10.2013
Сообщений: 564
19.01.2014, 15:54     ошибка calledfromwrongthreadexception #4
Цитата Сообщение от TRIUMF Посмотреть сообщение
так что ли?
Да именно так. Заработало у вас ?

Добавлено через 1 минуту
Цитата Сообщение от TRIUMF Посмотреть сообщение
а какие есть ещё способы
У активити есть метод runOnUiThread туда нужно передать ссылку на Runnable и код внутри метода run будет исполнен в main потоке. Т.е. суть та же самая.
TRIUMF
1 / 1 / 0
Регистрация: 14.03.2013
Сообщений: 103
19.01.2014, 16:23  [ТС]     ошибка calledfromwrongthreadexception #5
angryrobot, что то не работает как вы сказали он пустой становиться когда делаю te.setText(text); но там есть текст

Добавлено через 1 минуту
angryrobot, работает спасибо

Добавлено через 28 секунд
angryrobot, работает спасибо

Добавлено через 2 минуты
angryrobot, только второй раз когда я вызываю таймер ,то что я писал выше он мне ошибку выддаёт java.lang.IllegalStateException: Timer was canceled
angryrobot
Командир зеленых роботов
346 / 283 / 53
Регистрация: 08.10.2013
Сообщений: 564
19.01.2014, 17:51     ошибка calledfromwrongthreadexception #6
Цитата Сообщение от TRIUMF Посмотреть сообщение
только второй раз когда я вызываю таймер ,то что я писал выше он мне ошибку выддаёт
Насколько я помню, когда таймер уже был остановлен вызовом метода cancel, его нельзя заново запустить. Нужно его пересоздавать заново.
YuraAAA
1564 / 1306 / 269
Регистрация: 25.10.2009
Сообщений: 3,424
Записей в блоге: 2
19.01.2014, 21:15     ошибка calledfromwrongthreadexception #7
TRIUMF, angryrobot, пересоздавать надо TimerTask, а не Timer. TimerTask имплементит Runnable. Как и Thread. И если сделать interrupt потоку/cancel TimerTask - надо пересоздавать.
Yandex
Объявления
19.01.2014, 21:15     ошибка calledfromwrongthreadexception
Ответ Создать тему
Опции темы

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