Android Asynctask 中的 NetworkOnMainThreadException class
Android NetworkOnMainThreadException inside Asyntask class
此代码显示了到达 get 语句时的异常(代码行注释)。
接下来是代码,包括从 Http get Request:
获取评论列表
public class ObtencionComentariosPerfil extends AsyncTask<String, Integer, List<Comment>>{
@Override
protected List<Comment> doInBackground(String... params) {
// TODO Auto-generated method stub
HttpClient httpClient = new DefaultHttpClient();
URI url;
List<Comment> listaComentarios = new ArrayList<Comment>();
try {
url = new URI(params[1]);
HttpGet del = new HttpGet(url);
del.setHeader("content-type", "application/json");
del.setHeader("X-Auth-Token", params[0]);
System.out.println("El token params es: "+params[0]);
HttpResponse resp = httpClient.execute(del);// THE EXCEPTION shows here
StatusLine estatus = resp.getStatusLine();
if (estatus.getStatusCode() == 200) {
InputStream is = resp.getEntity().getContent();
CommentsParser parser= new CommentsParser();
listaComentarios = parser.parseoComentarios(is.toString());
} else {
System.out.println("Error");
listaComentarios = null;
}
} catch (URISyntaxException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (ClientProtocolException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return listaComentarios;
}
@Override
protected void onPostExecute(List<Comment> lista){
}
}
这里是从主代码调用的:
public List<Comment> obtieneComentariosPerfil(long idUsuario, String aut){
List<Comment> listaComentarios = new ArrayList<Comment>();
String url= "http://"+ip+":8080/api/users/"+idUsuario+"/comments";
String[] params= new String[2];
params[0]=aut;
params[1]=url;
ObtencionComentariosPerfil du = new ObtencionComentariosPerfil();
listaComentarios = du.doInBackground(params);
return listaComentarios;
}
我认为这一定是一个愚蠢的失败,但我找不到错误。谢谢
listaComentarios = du.doInBackground(params);
您通过调用 execute()
提交异步任务以在后台线程中执行,而不是通过在当前线程中直接调用 doInBackground()
回调。
将结果传回 onPostExecute()
中的 UI 线程。
因为你打电话给du.doInBackground(params);
你应该打电话给 du.excute(params)
此代码显示了到达 get 语句时的异常(代码行注释)。 接下来是代码,包括从 Http get Request:
获取评论列表public class ObtencionComentariosPerfil extends AsyncTask<String, Integer, List<Comment>>{
@Override
protected List<Comment> doInBackground(String... params) {
// TODO Auto-generated method stub
HttpClient httpClient = new DefaultHttpClient();
URI url;
List<Comment> listaComentarios = new ArrayList<Comment>();
try {
url = new URI(params[1]);
HttpGet del = new HttpGet(url);
del.setHeader("content-type", "application/json");
del.setHeader("X-Auth-Token", params[0]);
System.out.println("El token params es: "+params[0]);
HttpResponse resp = httpClient.execute(del);// THE EXCEPTION shows here
StatusLine estatus = resp.getStatusLine();
if (estatus.getStatusCode() == 200) {
InputStream is = resp.getEntity().getContent();
CommentsParser parser= new CommentsParser();
listaComentarios = parser.parseoComentarios(is.toString());
} else {
System.out.println("Error");
listaComentarios = null;
}
} catch (URISyntaxException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (ClientProtocolException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return listaComentarios;
}
@Override
protected void onPostExecute(List<Comment> lista){
}
}
这里是从主代码调用的:
public List<Comment> obtieneComentariosPerfil(long idUsuario, String aut){
List<Comment> listaComentarios = new ArrayList<Comment>();
String url= "http://"+ip+":8080/api/users/"+idUsuario+"/comments";
String[] params= new String[2];
params[0]=aut;
params[1]=url;
ObtencionComentariosPerfil du = new ObtencionComentariosPerfil();
listaComentarios = du.doInBackground(params);
return listaComentarios;
}
我认为这一定是一个愚蠢的失败,但我找不到错误。谢谢
listaComentarios = du.doInBackground(params);
您通过调用 execute()
提交异步任务以在后台线程中执行,而不是通过在当前线程中直接调用 doInBackground()
回调。
将结果传回 onPostExecute()
中的 UI 线程。
因为你打电话给du.doInBackground(params);
你应该打电话给 du.excute(params)