Асинхронное чтение JSON в Android приложении
Сегодня научимся получать JSON данные с удалённого ресурса на Android.
Для получения данных мы будем создавать отдельный фоновый(асинхронный) поток, чтобы приложение не залипало. Для создания отдельного потока будем "юзать" класс AsyncTask, но ещё можно Thread.
Для работы с потоком нам необходимо наследоваться от класса AsyncTask. Я создал класс ParseTask.
Обязательно переопределим методы:
- doInBackground – основной метод, который выполняется в новом потоке.
- onPostExecute – выполняется после doInBackground(). Имеет доступ к UI(User Interface). Используйте его для обновления пользовательского интерфейса, как только ваша фоновая задача будет завершена.
private class ParseTask extends AsyncTask<Void, Void, String>
В generic укажем параметры:
- Void - какие параметры мы принимаем, в нашем случае их нет
- Void - параметры для обновления информации о ходе выполнения
- String - возвращаем результат в виде строки.
В методе doInBackground() соединимся с сервером и получим JSON данные.
Сначала создадим экземпляр класса URL, аргумент - url ресурса.
URL url = new URL(url_api+req);
url_api+req
- опишу в листинге на pastebin.
Для соединения с веб-серверами мы будем использовать класс HttpURLConnection. Создадим объект HttpURLConnection с использованием метода openConnection() класса URL.
HttpURLConnection uC = (HttpURLConnection) url.openConnection();
Установим HTTP метод(способ) получения данных. По-умолчанию "GET", но я всё равно указал на всякий случай. Посмотреть все методы можно в документации.
uC.setRequestMethod("GET");
И даём команду соединиться с сервером:
uC.connect();
Прочитаем данные из потока с помощью метода getInputStream() и запишем в переменную.
inpStr = uC.getInputStream();
Далее резервируем место под 16 символов без перераспределения памяти с помощью класса StringBuffer.
sb = new StringBuffer();
Так же создадим экземпляр класса BufferedReader, он нужен для буферизациии входныx символьных потоков.
br = new BufferedReader(new InputStreamReader(inpStr));
InputStreamReader
- обеспечивают трансляцию между символьными и байтовыми потоками с учетом заданной кодировки символов.
String line;
while ((line = br.readLine()) != null) {
sb.append(line);
}
Объявляем строковый объект line
и наполним его данными из буферизации входных потоков, если они не равны нулю, а затем добавим их в зарезервируемое место.
Запишем
resultJoin = sb.toString();
, который потом вернём
return resultJoin;
для дальнейшей работы. Но это в последней части статьи.
В заключении хотел описать, почему именно json? А он для меня очень удобен. Его легко читать и распарсить. Я всегда стараюсь использовать его при прочих равных.
Материал подготовлен автором @zheev
Фото взято с сайта safefleet.com.tr