使用 AsyncTask 时出现错误 android.os.NetworkOnMainThreadException(使用 gson 解析 json 数据)

I get the error android.os.NetworkOnMainThreadException while using AsyncTask (parse json data with gson)

我想获取json数据,通过gson解析。我能够进行正确的解析,但是对于我所做的一个示例,我得到了这个错误:

android.os.NetworkOnMainThreadException

我知道在 UI 线程上使用 internet 是不允许的。 我的例子很简单:
在activity的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 块的行上。

onPostExecute 在 UI 线程上执行。

在 doInBackground 中读取您的 InputStream。