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

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

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 10, средняя оценка - 4.80
Hank
42 / 33 / 2
Регистрация: 28.12.2011
Сообщений: 210
30.11.2012, 21:55     Как разобраться с многопоточностью? #1
Здравствуйте.
Пытаюсь разобраться с многопоточностью, но что-то не выходит. В качестве примера пробую вывести в дочернем потоке строку в 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 просмотров)
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
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
42 / 33 / 2
Регистрация: 28.12.2011
Сообщений: 210
30.11.2012, 23:09  [ТС]     Как разобраться с многопоточностью? #3
Попробовал. Программа падает с той же ошибкой .
Chipito
0 / 0 / 0
Регистрация: 20.11.2011
Сообщений: 29
30.11.2012, 23:37     Как разобраться с многопоточностью? #4
Хм, ну судя по коду ошибки изменять TextView можно только с основного потока.
Hank
42 / 33 / 2
Регистрация: 28.12.2011
Сообщений: 210
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
 Аватар для lifestyle
231 / 227 / 4
Регистрация: 10.05.2009
Сообщений: 917
01.12.2012, 18:53     Как разобраться с многопоточностью? #6
если есть необходимость вывести из отдельного потока что то не GUI - используй Handler
Все очень просто, ну или AsyncTask тоже как варинат.
Hank
42 / 33 / 2
Регистрация: 28.12.2011
Сообщений: 210
04.12.2012, 21:26  [ТС]     Как разобраться с многопоточностью? #7
Сделал с помощью Handler.
У меня есть вопрос. Предположим на форме у меня лежит TextView и два Button`а. При нажатии на одну кнопку создается новый поток и чего-то там делает (например, выводит строку в TextView с задержкой в 20 сек - имитация длительного процесса). Если я буду нажимать, во время его выполнения, на вторую кнопку, будет выполняться код назначенный на нее?

Сейчас к меня ничего не происходит, т.е. даже кнопка не нажимается. AsyncTask пока не применял, хочу описанный выше код до ума довести.
kvaka
 Аватар для 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
 Аватар для mks81
7 / 7 / 0
Регистрация: 12.10.2012
Сообщений: 51
05.12.2012, 19:36     Как разобраться с многопоточностью? #9
Самое простое использовать AsyncTask, единственный минус - максимум 5 потоков
V0v1k
1157 / 981 / 1
Регистрация: 28.06.2012
Сообщений: 3,462
05.12.2012, 23:04     Как разобраться с многопоточностью? #10
постил в другой теме как увеличить количество, поищите...
Hank
42 / 33 / 2
Регистрация: 28.12.2011
Сообщений: 210
05.12.2012, 23:25  [ТС]     Как разобраться с многопоточностью? #11
Для ваших целей вообще нет надобности создавать отдельный поток. Вам нужно что-то типа этого:...
Надобность есть, т.к. моей целью является научиться оперировать потоками. Вывод текста с задержкой в данном случае является простой имитацией долгоиграющего процесса.
mks81
 Аватар для mks81
7 / 7 / 0
Регистрация: 12.10.2012
Сообщений: 51
06.12.2012, 11:44     Как разобраться с многопоточностью? #12
Цитата Сообщение от V0v1k Посмотреть сообщение
постил в другой теме как увеличить количество, поищите...
Прекрасно помню ту тему, это была моя тема! Тот вариант который предложили вы(точней предположили) не работает, именно в том случаи мне пришлось отказаться от AsyncTask, поскольку имелась необходимость большего количества потоков чем 5.
V0v1k
1157 / 981 / 1
Регистрация: 28.06.2012
Сообщений: 3,462
06.12.2012, 13:43     Как разобраться с многопоточностью? #13
если у вас не получилось, это не значит что нельзя это сделать...
mks81
 Аватар для mks81
7 / 7 / 0
Регистрация: 12.10.2012
Сообщений: 51
06.12.2012, 14:24     Как разобраться с многопоточностью? #14
Цитата Сообщение от V0v1k Посмотреть сообщение
если у вас не получилось, это не значит что нельзя это сделать...
Согласен! Просто на фоне того, что, перекопав весь интернет, задав вопрос на этом форуме, потратив немало времени экспериментируя разными вариантами, учитывая что далеко не новичок в программировании, и плюс ко всему натыкался на ту же, причем тоже нерешенную проблему на буржуйских форумах, мой ответ я счел более обоснованным, нежели ваше предположение...
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
10.12.2012, 03:01     Как разобраться с многопоточностью?
Еще ссылки по теме:

Android Не могу разобраться, как подключать Фрагменты
Не могу разобраться в коде Android
Разобраться с Delete View Android
Android Не могу разобраться с вёрсткой
Как быстро разобраться в чужой программе (Android)? Android

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

Или воспользуйтесь поиском по форуму:
dajver
 Аватар для dajver
406 / 270 / 18
Регистрация: 18.09.2010
Сообщений: 1,106
10.12.2012, 03:01     Как разобраться с многопоточностью? #15
http://dajver.blogspot.com/2012/12/android.html норм туториал, там описание использования сервисов, потоков, фонового выполнения задач
Yandex
Объявления
10.12.2012, 03:01     Как разобраться с многопоточностью?
Ответ Создать тему

Метки
android, многопоточность, многопоточность android
Опции темы

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