Я получаю сообщение об ошибке android.os.NetworkOnMainThreadException при использовании AsyncTask (анализ данных json с помощью gson)

Я хочу получить данные JSON и проанализировать их с помощью GSON. Я могу сделать правильный анализ, но для одного примера, который я сделал, я получил эту ошибку:

android.os.NetworkOnMainThreadException

Я знаю что используя internet на UI поток не допускается. Мой пример прост:
В onCreate деятельности это код:

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    kategoriListView =(ListView)findViewById(R.id.kategoriListView);

    new GetPlacesAsync().execute(placesUrl);
}

И на AsyncTask:

class GetPlacesAsync extends AsyncTask<String, Void, InputStream>
{
    @Override
    protected void onPreExecute() {
        super.onPreExecute();
    }

    @Override
    protected InputStream doInBackground(String... params) {

        DefaultHttpClient client = new DefaultHttpClient();
        String url = params[0];
        HttpGet getRequest = new HttpGet(url);

        try {

            HttpResponse getResponse = client.execute(getRequest);
            final int statusCode = getResponse.getStatusLine().getStatusCode();

            if (statusCode != HttpStatus.SC_OK) {
                Log.w(getClass().getSimpleName(),
                        "Error " + statusCode + " for URL " + url);
                return null;
            }

            HttpEntity getResponseEntity = getResponse.getEntity();
            return getResponseEntity.getContent();

        }
        catch (IOException e) {
            getRequest.abort();
            Log.w(getClass().getSimpleName(), "Error for URL " + url, e);
        }

        return null;
    }

    @Override
    protected void onPostExecute(InputStream inputStream) {
        super.onPostExecute(inputStream);

        Reader reader = new InputStreamReader(inputStream);

        Gson gson = new Gson();

        try
        {
            PlacesContainer places = gson.fromJson(reader, PlacesContainer.class);

            Toast.makeText(MainActivity.this, Integer.toString(places.getCountPlaces()), Toast.LENGTH_SHORT).show();
            Toast.makeText(MainActivity.this, places.message , Toast.LENGTH_LONG).show();

        }
        catch (Exception e)
        {
            Log.e("READ_PLACES_ERROR", e.toString());
        }

    }
}

Моя ошибка на линиях, где я использовал trycatch блок.

1 ответ

Решение

onPostExecute выполняется в потоке пользовательского интерфейса.

Читайте ваш InputStream в doInBackground.

Другие вопросы по тегам