如何在android AsyncTask中设置等待Internet连接的时间限制?

时间:2014-07-23 05:46:13

标签: java android-asynctask progressdialog android-internet

我使用AsyncTask连接Internet。一个进度对话框可以在onPreExecute()上显示,如果是,则表示它将执行http连接代码,同时在onPostExecute()中关闭进度对话框并且其工作正常。 / p>

但是如果在请求时网络连接可用并且在获取之前连接已关闭响应意味着始终显示“进度”对话框,则会出现问题。

现在我想解决这个问题,如果互联网断开之前获得响应意味着它会提醒我没有互联网连接并关闭进度对话框(可能设置加载时间限制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();
        }
    }

}

3 个答案:

答案 0 :(得分:1)

您可以使用广播接收器来获取网络连接或断开连接的事件。在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); 

答案 1 :(得分:1)

如果在http请求之前或期间关闭连接,则会抛出IOException。捕获该异常并关闭您的Dialog并告知用户此事件。

  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()的返回值。如果是,则使逻辑意识到可能发生异常。

答案 2 :(得分:0)

谢谢Steve Benettand Bhawna Raheja, 这么晚才回复很抱歉, 只需通过 HttpRequest.TimeOut 设置超时即可解决此错误。 我不知道怎么忘了抽出时间。

再次感谢你们两位。