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

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

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

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

30.11.2012, 21:55. Просмотров 1271. Ответов 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)? - Программирование Android
Всем, добрый день. Мне необходимо понять и изменить код в программе, которую писал другой android- программист. В связи с этим хотел...

Не могу разобраться с setImageDrawable - Программирование Android
Пытаюсь программно в классе прописать элементу ImageView картинку. Изображение хранится в ресурсах проекта в папке drawable-hdpi. Пишу: ...

Не могу разобраться с вёрсткой - Программирование Android
Не получается разделить между двумя кнопками layout. Вот XML: <RelativeLayout...

Помогите разобраться в екзепшене - Программирование Android
Не могу исправить ошибку помогите... логи 07-22 07:04:18.906: D/dalvikvm(1292): GC_CONCURRENT freed 938K, 10% free 10086K/11143K,...

Не могу разобраться с потоками - Программирование Android
Здравствуйте. Никак не могу понять принцип выноса задач в отдельный поток. Смысл прост: 1)есть метод который обновляет адаптер для...

Не могу разобраться в коде - Программирование Android
// создааем адаптер и настраиваем список scAdapter = new SimpleCursorAdapter(this, R.layout.item, null, from, to, 0); lvData =...

После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
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
49 / 40 / 3
Регистрация: 28.12.2011
Сообщений: 229
30.11.2012, 23:09  [ТС]     Как разобраться с многопоточностью? #3
Попробовал. Программа падает с той же ошибкой .
Chipito
0 / 0 / 0
Регистрация: 20.11.2011
Сообщений: 29
30.11.2012, 23:37     Как разобраться с многопоточностью? #4
Хм, ну судя по коду ошибки изменять TextView можно только с основного потока.
Hank
49 / 40 / 3
Регистрация: 28.12.2011
Сообщений: 229
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
49 / 40 / 3
Регистрация: 28.12.2011
Сообщений: 229
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
49 / 40 / 3
Регистрация: 28.12.2011
Сообщений: 229
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 Посмотреть сообщение
если у вас не получилось, это не значит что нельзя это сделать...
Согласен! Просто на фоне того, что, перекопав весь интернет, задав вопрос на этом форуме, потратив немало времени экспериментируя разными вариантами, учитывая что далеко не новичок в программировании, и плюс ко всему натыкался на ту же, причем тоже нерешенную проблему на буржуйских форумах, мой ответ я счел более обоснованным, нежели ваше предположение...
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
10.12.2012, 03:01     Как разобраться с многопоточностью?
Еще ссылки по теме:

Хочу разобраться с ListView - Программирование Android
В приложении "Секундомер" хочу при нажатии кнопки Lap выводить значение круга в ListView. и при каждом новом нажатии добавлять новое...

Разобраться с Delete View - Программирование Android
Разобрался с Add View if (resultCode == RESULT_OK) { editTitle = data.getStringExtra("keyEditTitle"); ...

Не могу разобраться с закладками - Программирование Android
Всем привет, подскажите, как реализовать закладки. Чтобы нажав кнопку,выскакивал диалог добавить закладку и соответственно поле ввода с...

Помоги разобраться с логами - Программирование Android
Я новичок, поэтому строго не судите, а помоги разобраться. Вот первый лог Я так понимаю, что ошибки в строках 397 и 493, 397 это ...

Не могу разобраться с созданием приложения - Программирование Android
Решил заняться разработкой под Android, при создании приложения получаю кучу ошибок, что-то с ресурсами. Среда - последняя Eclipse Luna....


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

Или воспользуйтесь поиском по форуму:
dajver
408 / 272 / 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     Как разобраться с многопоточностью?
Ответ Создать тему
Опции темы

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