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

相關問題