Форум программистов, компьютерный форум, киберфорум
Наши страницы
Программирование Android
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.50/8: Рейтинг темы: голосов - 8, средняя оценка - 4.50
Hank
64 / 55 / 5
Регистрация: 28.12.2011
Сообщений: 304
1

Как разобраться с многопоточностью?

30.11.2012, 21:55. Просмотров 1429. Ответов 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.
0
Вложения
Тип файла: txt log.txt (11.2 Кб, 2 просмотров)
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
30.11.2012, 21:55
Ответы с готовыми решениями:

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

Мистика с использованием координат, как разобраться?
Здравствуйте всем! есть интерфейс MainActivity который принтит координаты в...

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

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

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

14
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()
{
// Здесь ваш код
}
Попробуйте.
0
Hank
64 / 55 / 5
Регистрация: 28.12.2011
Сообщений: 304
30.11.2012, 23:09  [ТС] 3
Попробовал. Программа падает с той же ошибкой .
0
Chipito
0 / 0 / 0
Регистрация: 20.11.2011
Сообщений: 29
30.11.2012, 23:37 4
Хм, ну судя по коду ошибки изменять TextView можно только с основного потока.
0
Hank
64 / 55 / 5
Регистрация: 28.12.2011
Сообщений: 304
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 в дочернем потоке.
0
lifestyle
Mobile Developer
234 / 230 / 18
Регистрация: 10.05.2009
Сообщений: 917
01.12.2012, 18:53 6
если есть необходимость вывести из отдельного потока что то не GUI - используй Handler
Все очень просто, ну или AsyncTask тоже как варинат.
0
Hank
64 / 55 / 5
Регистрация: 28.12.2011
Сообщений: 304
04.12.2012, 21:26  [ТС] 7
Сделал с помощью Handler.
У меня есть вопрос. Предположим на форме у меня лежит TextView и два Button`а. При нажатии на одну кнопку создается новый поток и чего-то там делает (например, выводит строку в TextView с задержкой в 20 сек - имитация длительного процесса). Если я буду нажимать, во время его выполнения, на вторую кнопку, будет выполняться код назначенный на нее?

Сейчас к меня ничего не происходит, т.е. даже кнопка не нажимается. AsyncTask пока не применял, хочу описанный выше код до ума довести.
0
kvaka
31 / 31 / 3
Регистрация: 26.06.2012
Сообщений: 166
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, но просто с отсрочкой. Также надо помнить, что время отсрочки не будет точно соответствовать указанному в параметре, т. к. будет поставлено в общую очередь потока. Однако на единичных действиях это обычно вообще не заметно.
0
mks81
7 / 7 / 0
Регистрация: 12.10.2012
Сообщений: 51
05.12.2012, 19:36 9
Самое простое использовать AsyncTask, единственный минус - максимум 5 потоков
0
V0v1k
1160 / 984 / 1
Регистрация: 28.06.2012
Сообщений: 3,462
05.12.2012, 23:04 10
постил в другой теме как увеличить количество, поищите...
0
Hank
64 / 55 / 5
Регистрация: 28.12.2011
Сообщений: 304
05.12.2012, 23:25  [ТС] 11
Для ваших целей вообще нет надобности создавать отдельный поток. Вам нужно что-то типа этого:...
Надобность есть, т.к. моей целью является научиться оперировать потоками. Вывод текста с задержкой в данном случае является простой имитацией долгоиграющего процесса.
0
mks81
7 / 7 / 0
Регистрация: 12.10.2012
Сообщений: 51
06.12.2012, 11:44 12
Цитата Сообщение от V0v1k Посмотреть сообщение
постил в другой теме как увеличить количество, поищите...
Прекрасно помню ту тему, это была моя тема! Тот вариант который предложили вы(точней предположили) не работает, именно в том случаи мне пришлось отказаться от AsyncTask, поскольку имелась необходимость большего количества потоков чем 5.
0
V0v1k
1160 / 984 / 1
Регистрация: 28.06.2012
Сообщений: 3,462
06.12.2012, 13:43 13
если у вас не получилось, это не значит что нельзя это сделать...
0
mks81
7 / 7 / 0
Регистрация: 12.10.2012
Сообщений: 51
06.12.2012, 14:24 14
Цитата Сообщение от V0v1k Посмотреть сообщение
если у вас не получилось, это не значит что нельзя это сделать...
Согласен! Просто на фоне того, что, перекопав весь интернет, задав вопрос на этом форуме, потратив немало времени экспериментируя разными вариантами, учитывая что далеко не новичок в программировании, и плюс ко всему натыкался на ту же, причем тоже нерешенную проблему на буржуйских форумах, мой ответ я счел более обоснованным, нежели ваше предположение...
0
dajver
410 / 274 / 22
Регистрация: 18.09.2010
Сообщений: 1,114
10.12.2012, 03:01 15
http://dajver.blogspot.com/2012/12/android.html норм туториал, там описание использования сервисов, потоков, фонового выполнения задач
0
10.12.2012, 03:01
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
10.12.2012, 03:01

Проблема с многопоточностью
Собсно дело обстоит так: Есть richTextBox1, в котором есть 15(допустим)...

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

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


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

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

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