Форум программистов, компьютерный форум, киберфорум
Программирование Android
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.73/11: Рейтинг темы: голосов - 11, средняя оценка - 4.73
66 / 56 / 6
Регистрация: 28.12.2011
Сообщений: 322
1

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

30.11.2012, 21:55. Показов 1940. Ответов 14

Author24 — интернет-сервис помощи студентам
Здравствуйте.
Пытаюсь разобраться с многопоточностью, но что-то не выходит. В качестве примера пробую вывести в дочернем потоке строку в 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 Кб, 3 просмотров)
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
30.11.2012, 21:55
Ответы с готовыми решениями:

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

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

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

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

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

Сейчас к меня ничего не происходит, т.е. даже кнопка не нажимается. AsyncTask пока не применял, хочу описанный выше код до ума довести.
0
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
7 / 7 / 0
Регистрация: 12.10.2012
Сообщений: 51
05.12.2012, 19:36 9
Самое простое использовать AsyncTask, единственный минус - максимум 5 потоков
0
1162 / 986 / 1
Регистрация: 28.06.2012
Сообщений: 3,462
05.12.2012, 23:04 10
постил в другой теме как увеличить количество, поищите...
0
66 / 56 / 6
Регистрация: 28.12.2011
Сообщений: 322
05.12.2012, 23:25  [ТС] 11
Для ваших целей вообще нет надобности создавать отдельный поток. Вам нужно что-то типа этого:...
Надобность есть, т.к. моей целью является научиться оперировать потоками. Вывод текста с задержкой в данном случае является простой имитацией долгоиграющего процесса.
0
7 / 7 / 0
Регистрация: 12.10.2012
Сообщений: 51
06.12.2012, 11:44 12
Цитата Сообщение от V0v1k Посмотреть сообщение
постил в другой теме как увеличить количество, поищите...
Прекрасно помню ту тему, это была моя тема! Тот вариант который предложили вы(точней предположили) не работает, именно в том случаи мне пришлось отказаться от AsyncTask, поскольку имелась необходимость большего количества потоков чем 5.
0
1162 / 986 / 1
Регистрация: 28.06.2012
Сообщений: 3,462
06.12.2012, 13:43 13
если у вас не получилось, это не значит что нельзя это сделать...
0
7 / 7 / 0
Регистрация: 12.10.2012
Сообщений: 51
06.12.2012, 14:24 14
Цитата Сообщение от V0v1k Посмотреть сообщение
если у вас не получилось, это не значит что нельзя это сделать...
Согласен! Просто на фоне того, что, перекопав весь интернет, задав вопрос на этом форуме, потратив немало времени экспериментируя разными вариантами, учитывая что далеко не новичок в программировании, и плюс ко всему натыкался на ту же, причем тоже нерешенную проблему на буржуйских форумах, мой ответ я счел более обоснованным, нежели ваше предположение...
0
411 / 275 / 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
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
10.12.2012, 03:01
Помогаю со студенческими работами здесь

Сложности с многопоточностью
Всем привет! Столкнулся с такой проблемой. Есть класс, в котором в числе прочего имеется...

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

Не могу разобратся с многопоточностью
Доброго времени суток! Помогите советом, а то я завис =) Есть некий класс: ... class...

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


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

Или воспользуйтесь поиском по форуму:
15
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru