Форум программистов, компьютерный форум, киберфорум
Наши страницы
Программирование Android
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.80/5: Рейтинг темы: голосов - 5, средняя оценка - 4.80
Delphian
0 / 0 / 0
Регистрация: 14.08.2012
Сообщений: 138
#1

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

21.09.2016, 12:38. Просмотров 841. Ответов 9
Метки нет (Все метки)

Добрый день.

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

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?
0
Лучшие ответы (1)
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
21.09.2016, 12:38
Ответы с готовыми решениями:

Передача одному фрагменту объекта из другого
Если передавать объект(свой класс данных) из одного фрагмента в другой как...

Старт активити из другого потока
Добрый вечер! У меня есть Активити, с кнопкой, по клику на которую стартует...

Редактирование элементов layout из другого потока
Подскажите, как максимально просто редактировать элементы layout из другого...

Передача сообщения из потока. Handler
Добрый день, пытаюсь передать сообщение через Handler из потока, для обновления...

Передача звукового потока в микрофон
Здравствуйте все форумчане! Хотел бы узнать в какую мне сторону двигаться....

9
OlegJV
103 / 103 / 28
Регистрация: 13.03.2016
Сообщений: 474
21.09.2016, 13:00 #2
использовать Parseable и всунуть в Intent?
0
yura91
1 / 25 / 2
Регистрация: 23.10.2013
Сообщений: 2,326
21.09.2016, 13:47 #3
В главном тогда ресивер должен быть да, ну чтобы принять интент?
0
Pablito
2712 / 2158 / 732
Регистрация: 12.05.2014
Сообщений: 7,531
Завершенные тесты: 1
21.09.2016, 13:54 #4
что мешает просто вызвать какой-то метод в том же фрагменте, где стартует этот нелепый поток?
0
Delphian
0 / 0 / 0
Регистрация: 14.08.2012
Сообщений: 138
21.09.2016, 14:24  [ТС] #5
Паблито, а почему поток нелепый? Так он и вызывается в методе.

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

Но мне кажется, что есть более универсальные методы, хотя могу ошибаться. Также думал над использованием ExecutorService +Callable
0
yura91
1 / 25 / 2
Регистрация: 23.10.2013
Сообщений: 2,326
21.09.2016, 14:25 #6
что мешает просто вызвать какой-то метод в том же фрагменте, где стартует этот нелепый поток?
Можно подробнее немного?
0
Pablito
2712 / 2158 / 732
Регистрация: 12.05.2014
Сообщений: 7,531
Завершенные тесты: 1
21.09.2016, 14:29 #7
Лучший ответ Сообщение было отмечено Delphian как решение

Решение

еще раз - что мешает вызвать какой-то другой метод в том же фрагменте 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 Посмотреть сообщение
Можно подробнее немного?
для тебя - нет
1
Delphian
0 / 0 / 0
Регистрация: 14.08.2012
Сообщений: 138
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?
0
Pablito
2712 / 2158 / 732
Регистрация: 12.05.2014
Сообщений: 7,531
Завершенные тесты: 1
21.09.2016, 14:52 #9
Цитата Сообщение от Delphian Посмотреть сообщение
Хотя можно поставить синхронизацию, чтобы мог только один поток обращаться к методу
горе от ума
там что, будет 100500 потоков обращаться одновременно к этому методу из ОДНОЙ строки?
тут нет обращения к UI потоку поэтому вообще без разницы чем там и как будет писаться результат в поле класса
0
Delphian
0 / 0 / 0
Регистрация: 14.08.2012
Сообщений: 138
21.09.2016, 15:46  [ТС] #10
Паблито, спасибо, согласен, это уже переоптимизация, а не горя от ума)) Просто изучая этот вопрос заметил, что очень по-разному решают эту задачу и я пытаюсь понять, где и какой метод будет правильным, разумным, а не просто брать и программировать.
0
21.09.2016, 15:46
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
21.09.2016, 15:46

Сжатие и передача аудио/видео потока
Изучаю android программирование на практике. Пишу приложение, превращающее...

Получение значения из фонового потока и передача его в главный поток
как получить значение из фонового потока и передать его в главный поток?Знаю...

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


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

Или воспользуйтесь поиском по форуму:
10
Ответ Создать тему
Опции темы

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