Форум программистов, компьютерный форум, киберфорум
Программирование Android
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 5.00/5: Рейтинг темы: голосов - 5, средняя оценка - 5.00
7 / 7 / 4
Регистрация: 07.09.2012
Сообщений: 178
1

Загрузка информации через AsyncTask и возврат ее в mainactivity

26.01.2017, 19:23. Показов 904. Ответов 6
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Здравствуйте.
Задача вроде проста, а ничего не получается) мне необходим класс, который по указанной ссылке будет загружать json и возвращать как строку в главную активити. А на основе полученного JSON в главной активити будет происходить разбор и заполнение данных.
Класс для загрузки JSON как строки:
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
public class JSONLoader extends AsyncTask<String, Void, String> {
    private static final String ROOT_URL = "ссылка на страницу с JSON";
 
    @Override
    protected String doInBackground(String... apis) {
        StringBuilder result = new StringBuilder();
        StringBuilder newUrl = new StringBuilder();
        newUrl.append(ROOT_URL).append(apis[0]);
 
        HttpURLConnection urlConnection = null;
        try {
            URL url = new URL(newUrl.toString());
            urlConnection = (HttpURLConnection) url.openConnection();
            BufferedReader reader = new BufferedReader(new InputStreamReader(
                    urlConnection.getInputStream()));
 
            String temp = null;
            while ((temp = reader.readLine()) != null) {
                result.append(temp);
            }
        } catch (MalformedURLException e) {
            Log.e("UTException", e.toString());
        } catch (IOException e) {
            Log.e("UTException", e.toString());
        } finally {
            urlConnection.disconnect();
        }
        return result.toString();
    }
}
В главной активити при вызове ошибка Error54, 49) error: non-static method get() cannot be referenced from a static context
where Result is a type-variable:
Result extends Object declared in class AsyncTask
Java
1
2
3
4
5
6
7
JSONArray ja =  new JSONArray(JSONLoader.get()); // ошибка тут
        rowItems = new ArrayList<RowItem>();
        for (int i = 0; i < ja.length(); i++) {
JSONObject jsonobject = ja.getJSONObject(i);
            RowItem item = new RowItem(jsonobject.getInt("id")....);
            rowItems.add(item);
        }
Подскажите как исправить данную ошибку. Пробовал объявить как static jsonloader, но компилятор не позволяет, пишет static not allowed here.
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
26.01.2017, 19:23
Ответы с готовыми решениями:

MainActivity AsyncTask
Добрый вечер. Ребята тут небольшая проблема. Мне нужно Заполнить NavigatorDrawer (из базы)....

Возврат из фрагментов Drawer Menu в MainActivity
У меня есть Drawer Menu и MainActivity. Мне надо,чтобы из каждого фрагмента Drawer Menu можно было...

Загрузка ListView после AsyncTask
В классе, который расшияет AsyncTask, занружаю данные из JSON и сохраняю в бд. При первом запуске...

Загрузка текста и картинки в listView с AsyncTask
Привет всем. Имеется файл в формате JSON на удалённом сервере. Мне нужно вывести текст из...

6
2883 / 2295 / 769
Регистрация: 12.05.2014
Сообщений: 7,978
26.01.2017, 19:29 2
для начала надо создать где-то в активити экземпляр этого JSONLoader
и вызвать на нем метод execute

когда асинтаск отработает - он должен вызвать в активити какой-то метод и передать туда данные

Java
1
JSONLoader.get()
так делать неправильно и неверное по многим причинам
1
7 / 7 / 4
Регистрация: 07.09.2012
Сообщений: 178
26.01.2017, 19:51  [ТС] 3
Глупая ошибка забыть инициализировать объект класса, к методу которому обращаешься. Пожалуй стоит отдохнуть)
Уточните на счет JSONLoader.get(), неправильно если к классу без инициализации обращаться? или подход в целом неверный, в случае второго расскажи как лучше стоит сделать, спасибо.
0
2883 / 2295 / 769
Регистрация: 12.05.2014
Сообщений: 7,978
26.01.2017, 19:56 4
и первое и второе, неверный потому что вызов get() блокирует поток пока не вернется результат
теряется весь смысл асинхронности
0
7 / 7 / 4
Регистрация: 07.09.2012
Сообщений: 178
26.01.2017, 20:08  [ТС] 5
Разве если не блокировать поток, то в момент инициализации в мейн активити я не передам адаптеру списка пустые значения?
В таком случае мне нужно заполнять адаптер списка в самом классе JSONLoader в методе onPostExecute()?
0
2883 / 2295 / 769
Регистрация: 12.05.2014
Сообщений: 7,978
26.01.2017, 20:10 6
передашь конечно, поэтому я и писал - лучше строить все так что когда отработает асинктаск, он должен сам вызвать какой-то метод и передать данные, а уже потом можно обновить адаптер
1
7 / 7 / 4
Регистрация: 07.09.2012
Сообщений: 178
26.01.2017, 20:18  [ТС] 7
Все понял, спасибо.
0
26.01.2017, 20:18
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
26.01.2017, 20:18
Помогаю со студенческими работами здесь

Порционная загрузка с AsyncTask и бесконечный скролл
Есть большой JSON с текстом и картинками. С помощью AsyncTask я гружу все данные, но возникла...

Добавить к программе след действия: Сохранение и загрузка информации в текст. файл. Сохранение и загрузка информации в типизированный файл.
Помогите добавить к программе след действия: Сохранение и загрузка информации в текст. файл....

Можно ли activity_main.xml изменить через MainActivity.java?
Я б поискал в гугле, но я даже не знаю как сформулировать вопрос. Мне нужно по нажатию на кнопку...

Написать поток через класса AsyncTask
Доброй ночи. Есть поток, кусок кода (смотрите ниже) , который нужно переделать через класса...


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

Или воспользуйтесь поиском по форуму:
7
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru