使用 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。
我想获取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。