Модераторы: javastic
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> многопоточность Java и andoid 
V
    Опции темы
tyshkan007
Дата 15.1.2014, 15:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 4
Регистрация: 15.1.2014

Репутация: нет
Всего: нет



в андройде есть главный поток , создаем второй поток, к примеру он отработал(или во время своей работы) в качестве колбека можно заюзать Handler и получить от второго потока данные, и продолжить работу в главном потоке. 

Код

private Handler handler = new Handler();
private Timer timer;

    public void timerStart() {   
            timer = new Timer();
            timer.schedule(new TimerTask() {
                public void run() {
                    post();
                }
            }, 1000);
    }



    private void post() {
        final Runnable myRunnable = new Runnable() {
            @Override
            public void run() {
                //мы снова в главном потоке
            }
        };
        handler.post(myRunnable);
    }


как это провернуть без Handler средствами чисто java? как из потока 2 начать делать что либо первым потоком?


Это сообщение отредактировал(а) tyshkan007 - 15.1.2014, 15:35
PM MAIL   Вверх
Felan
Дата 15.1.2014, 18:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 284
Регистрация: 2.8.2007
Где: Самара

Репутация: нет
Всего: 7



Цитата(tyshkan007 @  15.1.2014,  17:34 Найти цитируемый пост)
средствами чисто java?

Чисто джава ничего не знает о главенстве потоков. Они для нее все одинаковые. В этом смысле там это все можно напрямую вызвать, главное синхронизацию не забыть.

Цитата(tyshkan007 @  15.1.2014,  17:34 Найти цитируемый пост)
как из потока 2 начать делать что либо первым потоком?

Несколько странная формулировка.
Если все-таки речь идет о работе с UI из вторичного потока, то так делать ельзя никак. Надо передавать данные в основной поток. Основной интсрумент это хэндлер. В взависимости от того, где находится кэллбэк, можно использовать методы активити.

Для чего это надо? Главный поток в идеале вообще ничего делать не дложен кроме обработка UI.
Какая именно стоит задача? Может есть лучше варианты smile


--------------------
// Любая сложная система - это темный лес. Каждый в этом лесу протаптывает свои тропинки, по ним и бегает. Лишь изредка, сходя с них, мы находим много интересного, а порою и страшного.
PM MAIL WWW ICQ   Вверх
tyshkan007
Дата 16.1.2014, 09:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 4
Регистрация: 15.1.2014

Репутация: нет
Всего: нет



Цитата(Felan @  15.1.2014,  18:57 Найти цитируемый пост)
Для чего это надо?


для саморазвития, у меня нету задачи. Просто не понимаю как работать с java потоками без android sdk.

Цитата(Felan @  15.1.2014,  18:57 Найти цитируемый пост)
 В этом смысле там это все можно напрямую вызвать, главное синхронизацию не забыть.


правильно ли я  представляю что такое синхронизация? это примерно как в mysql транзакции, грубо говоря временная блокировка доступа, и тут мой мозг начинает закипать. Если ставить синхронизацию то по идеи, если будут совершаться операции с синхронизированным объектом, сначала с 2 потока, потом с UI, то UI будет жать доступа к монитору объекта, то есть UI застопориться, какой смысл тогда вообще от второго потока, если он будет препятствовать первому? 

И как сказать первому(UI) потоку, эй я тут узнал новую инфу, отобрази ее? 
или как вы сказали:  
Цитата(Felan @  15.1.2014,  18:57 Найти цитируемый пост)
 Надо передавать данные в основной поток.


как это сделать средствами java?(без android sdk)

я чувствую что я что-то упускаю и путаю... smile 

PM MAIL   Вверх
Felan
Дата 16.1.2014, 12:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 284
Регистрация: 2.8.2007
Где: Самара

Репутация: нет
Всего: 7



Цитата(tyshkan007 @  16.1.2014,  11:21 Найти цитируемый пост)
для саморазвития, у меня нету задачи. Просто не понимаю как работать с java потоками без android sdk.

Вот тут все написано.


Цитата(tyshkan007 @  16.1.2014,  11:21 Найти цитируемый пост)
правильно ли я  представляю что такое синхронизация? это примерно как в mysql транзакции, грубо говоря временная блокировка доступа, и тут мой мозг начинает закипать. Если ставить синхронизацию то по идеи, если будут совершаться операции с синхронизированным объектом, сначала с 2 потока, потом с UI, то UI будет жать доступа к монитору объекта, то есть UI застопориться, какой смысл тогда вообще от второго потока, если он будет препятствовать первому? 

Ну вобщих чертах похоже, что правильно. Смысл в том, что бы выносить во вторичные потоки, то, что может выполняться параллельно. И не выносить то, что не может выполняться праллельно.


Цитата(tyshkan007 @  16.1.2014,  11:21 Найти цитируемый пост)
И как сказать первому(UI) потоку, эй я тут узнал новую инфу, отобрази ее? 

Через синхронизированные свойства какого-либо объекта. Через посылку сообщений... Как слать сообщения?.. Ну хэндлер - один из способов. В остальном почитай документацию на андроид. Я их не помню...

Цитата(tyshkan007 @  16.1.2014,  11:21 Найти цитируемый пост)
как это сделать средствами java?(без android sdk)


Без Android SDK нет никакого "Основного потока".

Я еще раз повторяю. UI поток андроида свляется особенным только с т.з. андроида. Java ничего про эти особенности не знает. А особенность заключатеся в том, что в нем постоянно крутиться цикл "выборки сообщений", который обрабатывает ввод пользователя и взаимодействует с контролами (View). Библиотека контролов не потокобезопастна, поэтому и нельзя смешивать дотуп к UI. К чистой Java это не имеет отношения. Это особенность фреймворка контролов.



Это сообщение отредактировал(а) Felan - 16.1.2014, 12:45


--------------------
// Любая сложная система - это темный лес. Каждый в этом лесу протаптывает свои тропинки, по ним и бегает. Лишь изредка, сходя с них, мы находим много интересного, а порою и страшного.
PM MAIL WWW ICQ   Вверх
ShellRaiser
Дата 19.1.2014, 22:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


еще чуть и закоммичу
*


Профиль
Группа: Участник
Сообщений: 156
Регистрация: 20.7.2007
Где: Белaрусь, Гродно

Репутация: нет
Всего: 1



Если вы хотите использовать хэндлер для UI потока, то лучше инициализировать через:

Цитата

private Handler mHandler = new Handler(Looper.getMainLooper()) {


Тогда ваш код гарантировано вызовется на UI треде.

+ если уж на то пошло, есть AsyncTask у которого pre и post execute вызываются на том же потоке, где вы вызвали execute,  но doInBackground в другом потоке

Это сообщение отредактировал(а) ShellRaiser - 19.1.2014, 22:15
PM MAIL ICQ Skype   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Android | Следующая тема »


 




[ Время генерации скрипта: 0.0519 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.