NetworkOnMainThreadException с AsyncTask

Мне нужно сделать несколько HTTP-запросов из моего приложения для Android. Я использую AsyncTask по мере необходимости, с сетевой частью в doInBackground.

Вот мой класс запроса:

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;
}
}    

И в моем потоке пользовательского интерфейса я использую его следующим образом:

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 ;
    }

Итак, я новичок в Android, но я думаю, что это исключение перехватывается, когда код, связанный с сетью, выполняется в основном потоке. Но я запускаю client.execute() в своем методе doInBackground(). Это вызов execute().get() (в потоке пользовательского интерфейса), который вызывает проблему?


person Karim Kouznetsov    schedule 31.03.2014    source источник
comment
переформатируйте свой код и опубликуйте logcat   -  person Ahmad Dwaik 'Warlock'    schedule 31.03.2014


Ответы (1)


У вас есть это

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

Вызов get() делает AsyncTask более не асинхронным. Он блокирует поток пользовательского интерфейса в ожидании ответа. Это приводит к NetworkOnMainThreadException.

Избавьтесь от get(3, TimeUnit.SECONDS);

Просто используйте request.execute(). Вы можете обновить пользовательский интерфейс в onPostExecute. Вы также можете использовать интерфейс в качестве обратного вызова для действия.

Проверьте ответ по черному поясу по ссылке ниже

Как вернуть логическое значение из AsyncTask?

person Raghunandan    schedule 31.03.2014
comment
Так вот в чем дело. Спасибо ! - person Karim Kouznetsov; 31.03.2014