当连接到服务器失败时,我试图取消我的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
。
有什么想法我应该如何检查连接是否没有建立?
我像Tanmay建议的那样,用一个布尔值解决了这个问题。但我还有另一个问题:每次doInBackground()被调用时,当它找不到服务器时,大约需要三分钟才能停止。当它可以到达服务器时一切都很好,但我不能在用户收到任何通知之前花费3分钟(我可以做一个后台进程,但仍然是3分钟等待条也不好)
谁知道我的代码有什么问题?这不可能是正常的,对吧?
从doInBackground()
方法返回String
,如果HTTPPost
失败,您可以返回null
。然后在onPostExecute()
方法中检查你得到了什么,如果String
为空不要做任何你真正想做的事情在成功运行时做你的UI工作
HttpHost target = new HttpHost("192.168.2.3", 80);
HttpPost post = new HttpPost("/ping/login.php");
response = client.execute(target, post);
这为我解决了缓慢的服务器响应