Форум программистов, компьютерный форум, киберфорум
Наши страницы
Программирование Android
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.75/4: Рейтинг темы: голосов - 4, средняя оценка - 4.75
TRIUMF
1 / 1 / 0
Регистрация: 14.03.2013
Сообщений: 103
1

ошибка calledfromwrongthreadexception

19.01.2014, 04:53. Просмотров 638. Ответов 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 минут
или не могу изменять из за потока или за чего ,или из за другого потока,как решить
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
19.01.2014, 04:53
Ответы с готовыми решениями:

IIS- asp ошибка: HTTP 500.100 - Внутренняя ошибка сервера - ошибка ASP Internet Information Services
Привет! Конфигурация win2000pro sp2, стандартный IIS, IE 5. При попытке...

Ошибка при чтении изменений при обмене РИБ: Ошибка при вызове метода контекста (ПрочитатьИзменения): Ошибка записи!
Доброго всем времени суток! подскажи пожалуйста как исправить ошибку: Ошибка...

Ошибка при добавлении в файл. Ошибка 101: Ошибка записи на диск (Error 101: Disk write error).
Здравствуйте, возникла проблема такого плана. Нужно произвести добавление...

Ошибка разбора XML/ Ошибка при вызове метода контекста (Прочитать)
1C 8.2 Документооборот КОРП 1.2 Текст ошибки...

Ошибка SQL запроса , в базе работает, а через IBQuery в Delphi ошибка
В Combobox загружены имена организаций. Нужно выполнить запрос на вывод всех...

6
angryrobot
Командир зеленых роботов
348 / 285 / 54
Регистрация: 08.10.2013
Сообщений: 565
19.01.2014, 13:19 2
Цитата Сообщение от TRIUMF Посмотреть сообщение
или не могу изменять из за потока или за чего ,или из за другого потока,как решить
Взаимодействие с компонентами графического интерфейса осуществляется только из главного потока, в противном случае возникнет эта ошибка о которой вы писали.
Цитата Сообщение от TRIUMF Посмотреть сообщение
как это обойти
Есть несколько способов. Например можно так:
Java
1
2
3
4
5
6
7
        te.post(new Runnable() {
            @Override
            public void run() {
                //это всегда выполняется в главном потоке
                te.setText("test");
            }
        });
0
TRIUMF
1 / 1 / 0
Регистрация: 14.03.2013
Сообщений: 103
19.01.2014, 15:51  [ТС] 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, а какие есть ещё способы
0
angryrobot
Командир зеленых роботов
348 / 285 / 54
Регистрация: 08.10.2013
Сообщений: 565
19.01.2014, 15:54 4
Цитата Сообщение от TRIUMF Посмотреть сообщение
так что ли?
Да именно так. Заработало у вас ?

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

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

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

Добавлено через 2 минуты
angryrobot, только второй раз когда я вызываю таймер ,то что я писал выше он мне ошибку выддаёт java.lang.IllegalStateException: Timer was canceled
0
angryrobot
Командир зеленых роботов
348 / 285 / 54
Регистрация: 08.10.2013
Сообщений: 565
19.01.2014, 17:51 6
Цитата Сообщение от TRIUMF Посмотреть сообщение
только второй раз когда я вызываю таймер ,то что я писал выше он мне ошибку выддаёт
Насколько я помню, когда таймер уже был остановлен вызовом метода cancel, его нельзя заново запустить. Нужно его пересоздавать заново.
0
YuraAAA
1578 / 1319 / 282
Регистрация: 25.10.2009
Сообщений: 3,436
Записей в блоге: 2
19.01.2014, 21:15 7
TRIUMF, angryrobot, пересоздавать надо TimerTask, а не Timer. TimerTask имплементит Runnable. Как и Thread. И если сделать interrupt потоку/cancel TimerTask - надо пересоздавать.
0
19.01.2014, 21:15
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
19.01.2014, 21:15

Django Ошибка доступа (403) Ошибка проверки CSRF. Запрос отклонён
На хостинге разместил сайт и не могу войти в админку, т.к. возникает 403 ошибка...

Ошибка HTTP 500 - внутреняя ошибка сервера при отправке почты.
Я пытаюсь отправить почту и присоединяю к ней письма Вот часть страницы Dim...

Загружается до окна приветствия и вылетает ошибка: isass.exe - Системная ошибка
Ребята, помогите кто может... весь день бьюсь безрезультатно... с утра пришёл...


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

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

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