Не получается скачать JSON в android приложение

228
07 января 2018, 06:16

На сервере есть https://api.androidhive.info/feed/feed.json (для примера с просторов)

Весь код в Service

Собственно код класса:

package tanat.androidtesttask;
import android.app.Service;
import android.content.Intent;
import android.os.IBinder;
import android.support.annotation.Nullable;
import java.io.BufferedReader;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import java.net.URL;
public class MyService extends Service {
@Nullable
@Override
public IBinder onBind(Intent intent) {
    return null;
}
protected String someTask() {
    HttpURLConnection urlConnection = null;
    BufferedReader reader = null;
    String strJson = "";

    // получаем данные с внешнего ресурса
    try {
        URL url = new URL("https://api.androidhive.info/feed/feed.json");
        urlConnection = (HttpURLConnection) url.openConnection();
        urlConnection.setRequestMethod("GET");
        urlConnection.connect();
        InputStream inputStream = urlConnection.getInputStream();
        StringBuffer buffer = new StringBuffer();
        reader = new BufferedReader(new InputStreamReader(inputStream));
        String line;
        while ((line = reader.readLine()) != null) {
            buffer.append(line);
        }
        strJson = buffer.toString();
    } catch (Exception e) {
        e.printStackTrace();
        strJson += e.getMessage();
    }
    return strJson;
}
}

Пытаюсь вытянуть json-строку, но ексепшен срабатывает на строке

InputStream inputStream = urlConnection.getInputStream();

то есть, не вытягивает даже InputStream.

Уже перерыл и stack весь и вообще весь интернет наверное, но никак не могу найти решение. Такой же код встречается много где на просторах и везде вроде как работает.

Ексепшен выдает

W/System.err: android.os.NetworkOnMainThreadException
<куча бреда>
W/System.err: at tanat.androidtesttask.MyService.someTask(MyService.java:34)
W/System.err: at 
tanat.androidtesttask.MainActivity.onClick(MainActivity.java:46)

Похоже что ругается на

urlConnection.connect();

Помогите пожалуйста, спасибо.

Answer 1

Судя по ошибке вы пытаетесь обратиться к серверу в главном потоке. Так запрещено.

Можно использовать AsyncTask.

private class GetTask extends AsyncTask<Void, Void, String> {

        @Override
        protected String doInBackground(Void... params) {
          \\здесь выполняйте обращение к серверу
            return strJson;\\возврат строки с json
        }

        @Override
        protected void onPostExecute(String answer) {
         \\здесь сделайте необходимое с полученной строкой
            Log.d(“tag”, answer)
        }
    }

Запускать так

new GetTask().execute();
READ ALSO
Подсчет количества цифр в каждом из целочисленных элементов массива

Подсчет количества цифр в каждом из целочисленных элементов массива

Подскажите, пожалуйста, как подсчитать количество цифр в каждом из целочисленных элементов массива (int)Скажем, массив выглядит так:

253
Посоветуйте пожалуйста плагины

Посоветуйте пожалуйста плагины

Посоветуйте пожалуйста плагины с таким hover-эффектом

253
Как расположить два видео в одну строку

Как расположить два видео в одну строку

Помогите пожалуйста! Мне нужно что бы 2 видео были в линию

401
Получить ноды в блоке div

Получить ноды в блоке div

Есть примерно такой костяк разметки :

289