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

Передача объекта обратно в главный поток из другого потока - Android

Войти
Регистрация
Восстановить пароль
 
Delphian
0 / 0 / 0
Регистрация: 14.08.2012
Сообщений: 104
21.09.2016, 12:38     Передача объекта обратно в главный поток из другого потока #1
Добрый день.

У меня ест фрагмент в котором я запускаю новый поток, после этого я хочу вернуть объект из этого потока в главный поток, как это лучше сделать?

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
public class IFragment extends Fragment     { 
private void getRecentlyTag(){
 
    new Thread(){
        @Override
        public void run() {
            HttpURLConnection urlConnection = null;
            try {
                URL url = new URL(Constants.API_URL);
                urlConnection = (HttpURLConnection) url
                        .openConnection();
                urlConnection.setRequestMethod("GET");
                urlConnection.setDoInput(true);
                urlConnection.connect();
                String response = Tools.streamToString(urlConnection
                        .getInputStream());
                JSONObject jsonObj = (JSONObject) new JSONTokener(response)
                        .nextValue();
 
            }catch(Exception exc){
                exc.printStackTrace();
            }finally {
                if(urlConnection!=null){
                    try{
                        urlConnection.disconnect();
                    }catch(Exception e){
                        e.printStackTrace();
                    }
                }
            }
          //  mHandler.sendMessage(mHandler.obtainMessage(what, 2, 0));
        }
    }.start();
}
}

Нужно вернуть jsonObj?
Лучшие ответы (1)
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
21.09.2016, 12:38     Передача объекта обратно в главный поток из другого потока
Посмотрите здесь:

Android Передача сообщения из потока. Handler
Android RTMP поток и Android
Android Передача звукового потока в микрофон
Android Можно ли, используя C2DM, передавать данные с телефона на комп и обратно?
Как сделать приложение полноэкранным и убрать вспомогательные кнопки "назад, главный экран." Android
Убить поток в адаптере Android
Сжатие и передача аудио/видео потока Android
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
OlegJV
 Аватар для OlegJV
99 / 99 / 29
Регистрация: 13.03.2016
Сообщений: 454
21.09.2016, 13:00     Передача объекта обратно в главный поток из другого потока #2
использовать Parseable и всунуть в Intent?
yura91
28 / 26 / 2
Регистрация: 23.10.2013
Сообщений: 2,137
21.09.2016, 13:47     Передача объекта обратно в главный поток из другого потока #3
В главном тогда ресивер должен быть да, ну чтобы принять интент?
Паблито
не спать!
1882 / 1616 / 500
Регистрация: 12.05.2014
Сообщений: 5,836
Завершенные тесты: 1
21.09.2016, 13:54     Передача объекта обратно в главный поток из другого потока #4
что мешает просто вызвать какой-то метод в том же фрагменте, где стартует этот нелепый поток?
Delphian
0 / 0 / 0
Регистрация: 14.08.2012
Сообщений: 104
21.09.2016, 14:24  [ТС]     Передача объекта обратно в главный поток из другого потока #5
Паблито, а почему поток нелепый? Так он и вызывается в методе.

OlegJV, думаю, что это плохая идея. Тогда уже лучше в handler добавить Object, преобразовав перед этим jsonObj.toString(), а потом достать msg.getData().getString().

Но мне кажется, что есть более универсальные методы, хотя могу ошибаться. Также думал над использованием ExecutorService +Callable
yura91
28 / 26 / 2
Регистрация: 23.10.2013
Сообщений: 2,137
21.09.2016, 14:25     Передача объекта обратно в главный поток из другого потока #6
что мешает просто вызвать какой-то метод в том же фрагменте, где стартует этот нелепый поток?
Можно подробнее немного?
Паблито
не спать!
1882 / 1616 / 500
Регистрация: 12.05.2014
Сообщений: 5,836
Завершенные тесты: 1
21.09.2016, 14:29     Передача объекта обратно в главный поток из другого потока #7
Сообщение было отмечено автором темы, экспертом или модератором как ответ
еще раз - что мешает вызвать какой-то другой метод в том же фрагменте IFragment и передать туда результат работы потока?

Java
1
2
3
4
5
6
7
8
9
    private void setResult(JSONObject jsonObj) {
// делаем что угодно с результатом, а если надо перейти в UI поток что пишем 
        getActivity().runOnUiThread(new Runnable() {
            @Override
            public void run() {
                // обновляем вьюшки и все такое 
            }
        });
    }
Добавлено через 18 секунд
Цитата Сообщение от yura91 Посмотреть сообщение
Можно подробнее немного?
для тебя - нет
Delphian
0 / 0 / 0
Регистрация: 14.08.2012
Сообщений: 104
21.09.2016, 14:48  [ТС]     Передача объекта обратно в главный поток из другого потока #8
Паблито, да понял о чём Вы говорите, спасибо! Ничего не мешает. То есть если я Вас правильно понял, то код будет приблизительно таким:

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
public class IFragment extends Fragment     { 
private void getRecentlyTag(){
 
    new Thread(){
        @Override
        public void run() {
            HttpURLConnection urlConnection = null;
            try {
                URL url = new URL(Constants.API_URL);
                urlConnection = (HttpURLConnection) url
                        .openConnection();
                urlConnection.setRequestMethod("GET");
                urlConnection.setDoInput(true);
                urlConnection.connect();
                String response = Tools.streamToString(urlConnection
                        .getInputStream());
                JSONObject jsonObj = (JSONObject) new JSONTokener(response)
                        .nextValue();
                setResults(jsonObj);
            }catch(Exception exc){
                exc.printStackTrace();
            }finally {
                if(urlConnection!=null){
                    try{
                        urlConnection.disconnect();
                    }catch(Exception e){
                        e.printStackTrace();
                    }
                }
            }
          //  mHandler.sendMessage(mHandler.obtainMessage(what, 2, 0));
        }
    }.start();
}
 
 
   JSONObject jsonObject;
    private  void setResults(JSONObject jsonObject){
        this.jsonObject=jsonObject;
    }
}
А нет ли здесь опасности, что я вызываю метод из другого потока? Хотя можно поставить синхронизацию, чтобы мог только один поток обращаться к методу.

Не могли бы Вы сказать, в чём преимущества этой реализации перед Handler? и интерфейсом Callable?
Паблито
не спать!
1882 / 1616 / 500
Регистрация: 12.05.2014
Сообщений: 5,836
Завершенные тесты: 1
21.09.2016, 14:52     Передача объекта обратно в главный поток из другого потока #9
Цитата Сообщение от Delphian Посмотреть сообщение
Хотя можно поставить синхронизацию, чтобы мог только один поток обращаться к методу
горе от ума
там что, будет 100500 потоков обращаться одновременно к этому методу из ОДНОЙ строки?
тут нет обращения к UI потоку поэтому вообще без разницы чем там и как будет писаться результат в поле класса
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
21.09.2016, 15:46     Передача объекта обратно в главный поток из другого потока
Еще ссылки по теме:

Android Редактирование элементов layout из другого потока
Android Обработка данных в Mysql и отправка обратно на андроид
Передача одному фрагменту объекта из другого Android
Settings Activity - При нажатии клавиши "Назад" не происходит возвращение на главный активити Android
Android Старт активити из другого потока

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

Или воспользуйтесь поиском по форуму:
Delphian
0 / 0 / 0
Регистрация: 14.08.2012
Сообщений: 104
21.09.2016, 15:46  [ТС]     Передача объекта обратно в главный поток из другого потока #10
Паблито, спасибо, согласен, это уже переоптимизация, а не горя от ума)) Просто изучая этот вопрос заметил, что очень по-разному решают эту задачу и я пытаюсь понять, где и какой метод будет правильным, разумным, а не просто брать и программировать.
Yandex
Объявления
21.09.2016, 15:46     Передача объекта обратно в главный поток из другого потока
Ответ Создать тему
Опции темы

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