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

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

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 10, средняя оценка - 4.80
Hank
51 / 42 / 3
Регистрация: 28.12.2011
Сообщений: 239
#1

Как разобраться с многопоточностью? - Программирование Android

30.11.2012, 21:55. Просмотров 1304. Ответов 14

Здравствуйте.
Пытаюсь разобраться с многопоточностью, но что-то не выходит. В качестве примера пробую вывести в дочернем потоке строку в TextView.

Пробовал делать по Шилдту не получилось.

Вот одна из реализаций:
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
package com.sample.httpExample;
 
import android.app.Activity;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.TextView;
 
 
public class HttpExampleActivity extends Activity
{
TextView TX;
 
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);
    TX = (TextView)findViewById(R.id.TX1);
    final Button but_1 = (Button)findViewById(R.id.But1);
    but_1.setOnClickListener(new View.OnClickListener(){
        @Override
        public void onClick(View v) {
            // TODO Auto-generated method stub  
            try {
                new newThread(TX);
            } catch (Exception e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
                TX.setText("Error");
            }
        }
        
    });
}
 
class newThread extends android.app.Activity implements Runnable{
    Thread t;
    public TextView TX;
    newThread(TextView par) {
        this.TX = par;
        t = new Thread(this, "Demo");
        t.start();
    }
    @Override
    public void run() {
        TX.append("123");       
    }
    
}
Возникает все время одно и тоже исключение:
FATAL EXCEPTION: Demo
?:??: W/?(?): android.view.ViewRootImpl$CalledFromWrongThreadException: Only the original thread that created a view hierarchy can touch its views.
Вложения
Тип файла: txt log.txt (11.2 Кб, 2 просмотров)
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
30.11.2012, 21:55
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Как разобраться с многопоточностью? (Программирование Android):

Мистика с использованием координат, как разобраться? - Программирование Android
Здравствуйте всем! есть интерфейс MainActivity который принтит координаты в MapsActivity: @Override public void...

Не могу разобраться, как подключать Фрагменты - Программирование Android
Решил научится использовать фрагменты, и сразу же наткнулся на проблему (Не могу понять как их подключать) Использовал готовый шаблон...

Как быстро разобраться в чужой программе (Android)? - Программирование Android
Всем, добрый день. Мне необходимо понять и изменить код в программе, которую писал другой android- программист. В связи с этим хотел...

С многопоточностью разобраться - C#
Помогите с многопоточностью разобраться

Проблема с многопоточностью - C#
Собсно дело обстоит так: Есть richTextBox1, в котором есть 15(допустим) логинов и паролей, в формате: логин;пароль. Мне нужно...

Проблемы с многопоточностью - C#
Программа для восстановления забытого пароля к rambler.ru В однопоточном режиме работала, после подключения потоков стала выдавать ошибки...

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Chipito
0 / 0 / 0
Регистрация: 20.11.2011
Сообщений: 29
30.11.2012, 22:41 #2
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
 
 public void onClick(View v) {
new Thread(new Runnable() {
                public void run() {
                  Func();
                }
            }).start();
}
 
 
public vod func()
{
// Здесь ваш код
}
Попробуйте.
Hank
51 / 42 / 3
Регистрация: 28.12.2011
Сообщений: 239
30.11.2012, 23:09  [ТС] #3
Попробовал. Программа падает с той же ошибкой .
Chipito
0 / 0 / 0
Регистрация: 20.11.2011
Сообщений: 29
30.11.2012, 23:37 #4
Хм, ну судя по коду ошибки изменять TextView можно только с основного потока.
Hank
51 / 42 / 3
Регистрация: 28.12.2011
Сообщений: 239
01.12.2012, 00:22  [ТС] #5
Хм, ну судя по коду ошибки изменять TextView можно только с основного потока.
Да, я это тоже так понял.

Мне кажется это как-то не правильно, должен же наверное быть способ чтобы вывод был возможен из других потоков.

Добавлено через 1 минуту
Попробовал немного изменить свой код. В конце основного потока добавил строчку:
Java
1
TX.append(Thread.currentThread().getName().toString()+" -- "+Thread.currentThread().getState().toString()+"\n");
А в дочернем потоке написал:
Java
1
TX1.append(t.getName().toString()+" -- "+t.getState().toString()+"\n");
И со второго клика по button`ну выводится Demo -- Runnable. Если строку в основном потоке убираю, то снова тишина. Не смотря на все это, при пошаговой отладке видно, что программа переходит в блок catch в дочернем потоке.
lifestyle
Mobile Developer
232 / 228 / 4
Регистрация: 10.05.2009
Сообщений: 917
01.12.2012, 18:53 #6
если есть необходимость вывести из отдельного потока что то не GUI - используй Handler
Все очень просто, ну или AsyncTask тоже как варинат.
Hank
51 / 42 / 3
Регистрация: 28.12.2011
Сообщений: 239
04.12.2012, 21:26  [ТС] #7
Сделал с помощью Handler.
У меня есть вопрос. Предположим на форме у меня лежит TextView и два Button`а. При нажатии на одну кнопку создается новый поток и чего-то там делает (например, выводит строку в TextView с задержкой в 20 сек - имитация длительного процесса). Если я буду нажимать, во время его выполнения, на вторую кнопку, будет выполняться код назначенный на нее?

Сейчас к меня ничего не происходит, т.е. даже кнопка не нажимается. AsyncTask пока не применял, хочу описанный выше код до ума довести.
kvaka
29 / 29 / 3
Регистрация: 26.06.2012
Сообщений: 163
05.12.2012, 10:50 #8
Для ваших целей вообще нет надобности создавать отдельный поток. Вам нужно что-то типа этого:

Java
1
2
3
4
5
6
7
8
9
10
button.setOnClickListener(new OnClickListener() {
            
            public void onClick(View v) {               
                button.postDelayed(new Runnable() {                 
                    public void run() {
                        textView.setText("Delayed text");                       
                    }
                }, 20 * 1000);              
            }
        });
В данном случае действие произойдет в потоке GUI, но просто с отсрочкой. Также надо помнить, что время отсрочки не будет точно соответствовать указанному в параметре, т. к. будет поставлено в общую очередь потока. Однако на единичных действиях это обычно вообще не заметно.
mks81
7 / 7 / 0
Регистрация: 12.10.2012
Сообщений: 51
05.12.2012, 19:36 #9
Самое простое использовать AsyncTask, единственный минус - максимум 5 потоков
V0v1k
1158 / 982 / 1
Регистрация: 28.06.2012
Сообщений: 3,462
05.12.2012, 23:04 #10
постил в другой теме как увеличить количество, поищите...
Hank
51 / 42 / 3
Регистрация: 28.12.2011
Сообщений: 239
05.12.2012, 23:25  [ТС] #11
Для ваших целей вообще нет надобности создавать отдельный поток. Вам нужно что-то типа этого:...
Надобность есть, т.к. моей целью является научиться оперировать потоками. Вывод текста с задержкой в данном случае является простой имитацией долгоиграющего процесса.
mks81
7 / 7 / 0
Регистрация: 12.10.2012
Сообщений: 51
06.12.2012, 11:44 #12
Цитата Сообщение от V0v1k Посмотреть сообщение
постил в другой теме как увеличить количество, поищите...
Прекрасно помню ту тему, это была моя тема! Тот вариант который предложили вы(точней предположили) не работает, именно в том случаи мне пришлось отказаться от AsyncTask, поскольку имелась необходимость большего количества потоков чем 5.
V0v1k
1158 / 982 / 1
Регистрация: 28.06.2012
Сообщений: 3,462
06.12.2012, 13:43 #13
если у вас не получилось, это не значит что нельзя это сделать...
mks81
7 / 7 / 0
Регистрация: 12.10.2012
Сообщений: 51
06.12.2012, 14:24 #14
Цитата Сообщение от V0v1k Посмотреть сообщение
если у вас не получилось, это не значит что нельзя это сделать...
Согласен! Просто на фоне того, что, перекопав весь интернет, задав вопрос на этом форуме, потратив немало времени экспериментируя разными вариантами, учитывая что далеко не новичок в программировании, и плюс ко всему натыкался на ту же, причем тоже нерешенную проблему на буржуйских форумах, мой ответ я счел более обоснованным, нежели ваше предположение...
dajver
408 / 272 / 18
Регистрация: 18.09.2010
Сообщений: 1,108
10.12.2012, 03:01 #15
http://dajver.blogspot.com/2012/12/android.html норм туториал, там описание использования сервисов, потоков, фонового выполнения задач
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
10.12.2012, 03:01
Привет! Вот еще темы с ответами:

Работа с многопоточностью - Java SE
Имеется следующая довольно не сложная задачка: Написать программу, которая запускает параллельно 300 потоков, класса IncreaserThread....

Проблемы с многопоточностью - PHP Сети
Привет всем! Работаю в конторе, которая занимается разработкой радиоэлектроники и продажей компонентов. Начальство договорилось с...

Проблемы с многопоточностью в VB - Visual Basic
Public Declare Function CreateThread Lib 'kernel32' (lpThreadAttributes As Any, ByVal dwStackSize As Long, lpStartAddress As Long,...

Информация по работе с многопоточностью - C#
Будьте любезны, "ткните меня носом" в понятный туториал с многопоточностью, или дайте рабочий не сложный исходник, желательно с...


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

Или воспользуйтесь поиском по форуму:
Yandex
Объявления
10.12.2012, 03:01
Ответ Создать тему
Опции темы

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