Форум программистов, компьютерный форум, киберфорум
Наши страницы
Программирование Android
Войти
Регистрация
Восстановить пароль
 
Vlad_
7 / 7 / 4
Регистрация: 07.09.2012
Сообщений: 178
#1

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

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

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

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

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

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

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

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

6
Pablito
2663 / 2145 / 728
Регистрация: 12.05.2014
Сообщений: 7,487
Завершенные тесты: 1
26.01.2017, 19:29 #2
для начала надо создать где-то в активити экземпляр этого JSONLoader
и вызвать на нем метод execute

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

Java
1
JSONLoader.get()
так делать неправильно и неверное по многим причинам
1
Vlad_
7 / 7 / 4
Регистрация: 07.09.2012
Сообщений: 178
26.01.2017, 19:51  [ТС] #3
Глупая ошибка забыть инициализировать объект класса, к методу которому обращаешься. Пожалуй стоит отдохнуть)
Уточните на счет JSONLoader.get(), неправильно если к классу без инициализации обращаться? или подход в целом неверный, в случае второго расскажи как лучше стоит сделать, спасибо.
0
Pablito
2663 / 2145 / 728
Регистрация: 12.05.2014
Сообщений: 7,487
Завершенные тесты: 1
26.01.2017, 19:56 #4
и первое и второе, неверный потому что вызов get() блокирует поток пока не вернется результат
теряется весь смысл асинхронности
0
Vlad_
7 / 7 / 4
Регистрация: 07.09.2012
Сообщений: 178
26.01.2017, 20:08  [ТС] #5
Разве если не блокировать поток, то в момент инициализации в мейн активити я не передам адаптеру списка пустые значения?
В таком случае мне нужно заполнять адаптер списка в самом классе JSONLoader в методе onPostExecute()?
0
Pablito
2663 / 2145 / 728
Регистрация: 12.05.2014
Сообщений: 7,487
Завершенные тесты: 1
26.01.2017, 20:10 #6
передашь конечно, поэтому я и писал - лучше строить все так что когда отработает асинктаск, он должен сам вызвать какой-то метод и передать данные, а уже потом можно обновить адаптер
1
Vlad_
7 / 7 / 4
Регистрация: 07.09.2012
Сообщений: 178
26.01.2017, 20:18  [ТС] #7
Все понял, спасибо.
0
26.01.2017, 20:18
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
26.01.2017, 20:18

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

Загрузка сохраненной информации
Доброго времени суток. Подскажите пожалуйста, как можно организовать...

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


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

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

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