Отменить AsyncTask при сбое HTTPPost? - PullRequest
2 голосов
/ 21 апреля 2011

Я пытаюсь отменить мой 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-минутная полоса ожидания тоже не годится)

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

Ответы [ 2 ]

3 голосов
/ 21 апреля 2011

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

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

0 голосов
/ 22 апреля 2011
HttpHost target = new HttpHost("192.168.2.3", 80);
HttpPost post = new HttpPost("/ping/login.php");

response = client.execute(target, post);

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

...