Отменить AsyncTask при сбое HTTPPost?

Я пытаюсь отменить свою AsyncTask при сбое подключения к серверу. Я пробовал cancel(), но все равно вызывается метод onPostExecute() вместо onCancelled().

Вот что у меня внутри doInBackground():

    protected String doInBackground(String... params) {
        Log.i("ping", "doInBackground() started");

        DefaultHttpClient client = new DefaultHttpClient();
        HttpConnectionParams.setConnectionTimeout(client.getParams(), 15000);

        HttpResponse response;
        HttpEntity entity;

            try {
                HttpPost post = new HttpPost("http://192.168.1.6/ping/login.php");

                List<NameValuePair> nvps = new ArrayList<NameValuePair>();
                nvps.add(new BasicNameValuePair("username", getEmail()));
                nvps.add(new BasicNameValuePair("password", getPassword()));

                post.setHeader("Content-Type", "application/x-www-form-urlencoded");
                post.setEntity(new UrlEncodedFormEntity(nvps, HTTP.UTF_8));

                response = client.execute(post);
                entity = response.getEntity();

                InputStream iStream = entity.getContent();
                read(iStream);
                iStream.close();

                if(entity != null)
                    entity.consumeContent();

                Log.i("ping", "doInBackground() vervolgd");


            } catch (Exception e) {
                e.printStackTrace();
                Log.e("tvsping", "Exception: " + e.getMessage());
                cancel(true);
            }
        return null;
    }

Я пытаюсь посмотреть, что происходит, когда сервер недоступен (я его выключаю, поэтому мой телефон никак не отвечает), и получаю IOException: the connection was reset.

Любые идеи, как я должен проверить, не установлено ли соединение?

обновление Я решил это, как предложил Танмай, с помощью логического значения. Но у меня есть другая проблема: каждый раз, когда вызывается doInBackground(), требуется около трех минут, чтобы остановиться, когда он не может найти серверы. Все в порядке, когда он может связаться с сервером, но я не могу допустить, чтобы это заняло 3 минуты, прежде чем пользователь будет уведомлен о чем-либо (я мог бы выполнить фоновый процесс, но все же 3-минутная полоса ожидания тоже не годится)

Есть идеи, что не так с моим кодом? Это не может быть нормальным, верно?


person Community    schedule 21.04.2011    source источник


Ответы (2)


Из метода doInBackground() вы возвращаете String. Вы можете вернуть null, если ваш HTTPPost терпит неудачу. А затем в методе onPostExecute() просто проверьте, что вы получаете, если String имеет значение null, не делайте ничего, что вы действительно хотите, и при успешном выполнении ваш пользовательский интерфейс работает

Надеюсь, что это поможет вам.

person Tanmay Mandal    schedule 21.04.2011
comment
Любая идея, как я могу «обнаружить» эту проблему быстрее? Потому что теперь проходит примерно три минуты, прежде чем я получаю эту ошибку the connection was reset. Должен ли я вернуть false внутри улова или где-то еще? - person ; 21.04.2011
comment
Нет возможности быстрее отслеживать проблему. Здесь, как я заметил, ваше значение времени ожидания соединения составляет 15 секунд. Вы можете изменить его на небольшое значение. Также используйте метод setSoTimeout для времени ожидания сокета. - person Tanmay Mandal; 21.04.2011
comment
Даже при меньшем времени ожидания соединения по какой-то причине требуется чуть более трех минут, прежде чем он перейдет к onPostExecute() Вот почему я думаю, что с моим кодом должно быть что-то не так. - person ; 21.04.2011

HttpHost target = new HttpHost("192.168.2.3", 80);
HttpPost post = new HttpPost("/ping/login.php");

response = client.execute(target, post);

Это решило проблему с медленным ответом сервера для меня.

person Community    schedule 22.04.2011