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

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

Войти
Регистрация
Восстановить пароль
 
Delphian
0 / 0 / 0
Регистрация: 14.08.2012
Сообщений: 138
#1

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

21.09.2016, 12:38. Просмотров 218. Ответов 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
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Передача объекта обратно в главный поток из другого потока (Программирование Android):

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

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

Редактирование элементов layout из другого потока - Программирование Android
Подскажите, как максимально просто редактировать элементы layout из другого потока. К примеру, есть код: new Thread(new Runnable()...

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

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

Получение значения из фонового потока и передача его в главный поток - C#
как получить значение из фонового потока и передать его в главный поток?Знаю что метод должен быть только void...

9
OlegJV
103 / 103 / 29
Регистрация: 13.03.2016
Сообщений: 472
21.09.2016, 13:00 #2
использовать Parseable и всунуть в Intent?
0
yura91
1 / 25 / 2
Регистрация: 23.10.2013
Сообщений: 2,310
21.09.2016, 13:47 #3
В главном тогда ресивер должен быть да, ну чтобы принять интент?
0
Pablito
2505 / 1989 / 619
Регистрация: 12.05.2014
Сообщений: 6,943
Завершенные тесты: 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,310
21.09.2016, 14:25 #6
что мешает просто вызвать какой-то метод в том же фрагменте, где стартует этот нелепый поток?
Можно подробнее немного?
0
Pablito
2505 / 1989 / 619
Регистрация: 12.05.2014
Сообщений: 6,943
Завершенные тесты: 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 Посмотреть сообщение
Можно подробнее немного?
для тебя - нет
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
2505 / 1989 / 619
Регистрация: 12.05.2014
Сообщений: 6,943
Завершенные тесты: 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
Привет! Вот еще темы с ответами:

Получить результат из потока в главный поток - Java SE
Всем добрый вечер. Я только начинаю изучать многопоточность, столкнулся со следующей задачей: "Задана матрица действительных чисел. Найти...

Как передать данные из дочерного потока в главный поток - C#
Здравствуйте. Искал по форуму есть похожие темы но нет решения. Есть класс который загружает данные по очереди из определенного адреса в...

Запуск потока из другого и обратно - Delphi
Есть 3 потока,нужно из 1 потока запустить 2,2 что-то делает,останавливается-запускает 1,первый запускает 3 поток.И так несколько раз,как...

Передача объекта методу другого объекта другого класса - C++
Всем привет. Есть у меня класс test1, который имеет конструкторы только с параметрами. Другой класс test2 имеет конструктор, который...


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

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

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