Я получаю сообщение об ошибке 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());
}
}
}
Моя ошибка на линиях, где я использовал try
catch
блок.
1 ответ
Решение
onPostExecute выполняется в потоке пользовательского интерфейса.
Читайте ваш InputStream в doInBackground.