0

我需要从我的Android应用程序做一些HTTP请求。 我用的AsyncTask根据需要,在doInBackground网络部分。NetworkOnMainThreadException用的AsyncTask

这里是我的请求类:

public class AsyncRequest extends AsyncTask<Void, Integer, HttpResponse>{ 

private  ProgressDialog dialog; 
private  Activity  activity; 
private  HttpUriRequest query; 
private  HttpClient  client; 
private  HttpResponse response; 
private  String   dialogMsg; 
private  String   uri; 

public String getUri() { 
    return uri; 
} 

public void setUri(String uri) { 
    this.uri = uri; 
} 

public AsyncRequest(Activity a, HttpUriRequest q, HttpClient c, String m) { 
    query = q; 
    client = c; 
    activity = a; 
    dialog = new ProgressDialog(a); 
    dialogMsg = m; 
} 

@Override 
protected void onPostExecute(HttpResponse res) { 
    if (dialog.isShowing()) 
     dialog.dismiss(); 
} 

protected void onPreExecute() { 
    this.dialog.setMessage(dialogMsg); 
    this.dialog.show(); 
} 

@Override 
protected HttpResponse doInBackground(Void... arg0) { 
    try { 
     response = client.execute(query); 
    } catch (ClientProtocolException e) { 
     e.printStackTrace(); 
    } catch (IOException e) { 
     e.printStackTrace(); 
    }  
    return response; 
} 

protected HttpResponse getResponse() { 
    return response; 
} 
}  

而且,在我的UI线程,我用这种方式:

AsyncRequest  request; 
    HttpClient   httpClient = new DefaultHttpClient(); 
    HttpGet    getQuery = new   HttpGet("Here goes my url"); 
    HttpResponse  response = null; 
    String    rt = "Null"; 
    getQuery.setHeader("Authorization", getIntent().getExtras().getString("token")); 

    request = new AsyncRequest(this, getQuery, httpClient, "Loading events..."); 
    try { 
     response = request.execute().get(3, TimeUnit.SECONDS); 
    } catch (Exception e) { 
     e.printStackTrace(); 
    } 
    HttpEntity entity = response.getEntity(); 
    try { 
     rt = EntityUtils.toString(entity); 
    } catch (Exception e) { 
      e.printStackTrace(); 
     return ; 
    } 

所以,我的机器人初学者,但我想这在主线程中执行与网络相关的代码时会捕获异常。但我在我的doInBackground()方法中运行client.execute()。它是执行()调用。获得()(在UI线程)引起该问题?

+0

重新格式化您的代码检查答案,并张贴的logcat –

回答

2

你有这样的

response = request.execute().get(3, TimeUnit.SECONDS); 

调用get()使得AsyncTask没有更多的异步。它阻止了ui线程等待响应。这导致NetworkOnMainThreadException

摆脱get(3, TimeUnit.SECONDS);

只需使用request.execute()。您可以在onPostExecute更新ui。您还可以使用界面作为活动的回调。

通过在黑带以下链接

How do I return a boolean from AsyncTask?

+0

所以这是的东西。谢谢 ! –

+0

不用客气 – Raghunandan

相关问题