Как установить ограничение по времени ожидания подключения к Интернету в Android AsyncTask?

Я использую AsyncTask для подключения к Интернету. Диалоговое окно хода выполнения может отображаться в onPreExecute(), и я проверяю, находится ли он в сети на этом мобильном устройстве, если да, это означает, что он выполнит код HTTP-соединения, а также закроет диалоговое окно хода выполнения в onPostExecute(), и его работа будет хорошей.

Но у меня проблема, если сетевое соединение доступно во время Запроса, а соединение закрыто до получения Ответа, что означает, что диалоговое окно «Ход выполнения» отображается всегда.

Теперь я хочу решить эту проблему, если межсоединение отключается до получения ответа, что означает, что он предупреждает меня об отсутствии подключения к Интернету и закрывает диалоговое окно прогресса (может установить ограничение времени загрузки на 30 секунд).

ниже мой код.

может ли кто-нибудь помочь?

   public class SubjectTask extends AsyncTask<Void, Void, Integer> {

    @Override
    protected void onPreExecute() {
        progressDialog = ProgressDialog.show(Login.this, "Loading",
                "Please wait...");
        //checkConnection();

    }

    @Override
    protected Integer doInBackground(Void... arg0) {

        if (isOnline()) {  //using ConnectivityManager And Network Info

            try {

                //Http Request connections

            } catch (Exception e) {
                e.printStackTrace();
            }



            return 1;
        } else {

            alert("Check your internet connection");
            return 0;
        }

    }

    protected void onPostExecute(Integer result) {
        super.onPostExecute(result);
        if (progressDialog.isShowing()) {
            progressDialog.dismiss();
        }
    }

}

person Mohanraj S K    schedule 23.07.2014    source источник


Ответы (3)


Вы можете использовать широковещательный приемник, чтобы получить событие сетевого подключения или отключения. зарегистрируйте этот приемник в методе doInbackground и отмените его регистрацию в методе onPostExecute.

 broadcastReceiver = new BroadcastReceiver() {

                    @Override
                    public void onReceive(Context context, Intent intent) {

                        ConnectivityManager connectivity = (ConnectivityManager) context
                                .getSystemService(Context.CONNECTIVITY_SERVICE);


                            NetworkInfo info = connectivity.getActiveNetworkInfo();
                            //Play with the info about current network state
                             if(info.getState()== NetworkInfo.State.DISCONNECTED) {
                               // hide loader and show alert here
}

                        }

                    }
                };

                intentFilter = new IntentFilter();
                intentFilter.addAction(ConnectivityManager.CONNECTIVITY_ACTION);
                registerReceiver(broadcastReceiver, intentFilter); 
person Bhawna Raheja    schedule 26.08.2014

Если соединение будет закрыто до или во время http-запроса, будет выдано IOException. Перехватите это исключение и закройте там свой диалог и сообщите пользователю об этом событии.

  if (isOnline()) {  //using ConnectivityManager And Network Info

        try {

            //Http Request connections

        } catch (IOException e) {
            e.printStackTrace();
            // Do the error handling here

        } catch (ClientProtocolException e) {
            e.printStackTrace();
        } 
  }

Я не знаю, действительно ли вам нужно возвращаемое значение для вашего onPostExecute(). Если да, подумайте, чтобы логика знала, что может возникнуть исключение.

person Steve Benett    schedule 26.08.2014

Я благодарю Steve Benetta и Bhawna Raheja, извините за поздний ответ. Просто я решил эту ошибку, установив Timeout через HttpRequest.TimeOut. Я не знаю, как я забыл установить тайм-аут.

Еще раз спасибо Вам обоим.

person Mohanraj S K    schedule 10.09.2014