我使用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();
}
}
}
答案 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)
再次感谢你们两位。