我正在创建一个Android应用程序但是找不到(如果?)服务器,它会挂起工具包(SDK /模拟器?)。 我附上了我的登录代码。请帮我找到解决方案。我只是想要,如果服务器不可用,我的应用程序将保持登录页面而不会自行挂起。
当我调试我的代码时,我没有获得httpResponse的值,并且在此行之后
HttpResponse httpResponse = httpclient.execute(httpPost);
问题发生了
public String login(String userName, String password){
try {
String url = URL+ "?flag="+"on"+"&user="+userName+"&pass="+password;
httpPost = new HttpPost(url);
HttpResponse httpResponse = httpclient.execute(httpPost);
int statuscode = httpResponse.getStatusLine().getStatusCode();
if (statuscode == 200) {
String responseMsg = getResponse(httpResponse);
return responseMsg;
}else{
Log.e(TAG, statuscode+"");
}
} catch (ClientProtocolException e) {
Log.e(TAG, e.getMessage(),e);
} catch (IOException e) {
Log.e(TAG, e.getMessage(),e);
}
return null;
}
答案 0 :(得分:2)
查看此How to set HttpResponse timeout for Android in Java。并且真的应该在单独的线程/ AsyncTask中进行所有网络通信,而不是在主线程上。
答案 1 :(得分:2)
如果您的模拟器上的UI挂起,您可能会在UI线程上执行网络操作 - 这将阻止所有UI操作,直到网络操作完成。在这里阅读如何在一个线程中运行此代码: http://developer.android.com/resources/articles/painless-threading.html
答案 2 :(得分:2)
您还应考虑定义超时(例如5秒),以便系统长时间不尝试连接到无法访问的服务器。
final HttpParams httpParams = httpClient.getParams();
HttpConnectionParams.setConnectionTimeout(httpParams, 5000);
HttpConnectionParams.setSoTimeout(httpParams, 5000);
答案 3 :(得分:1)
你有某种例外吗?如果网址格式不正确,您将获得MalformedURLException
,如果服务器不可用/链接已损坏IOException
。
您希望通过ResponseHandler
ResponseHandler<String> responseHandler = new BasicResponseHandler();
try {
responseString = mHttpClient.execute(post, responseHandler);
Log.d(TAG, "doHTTPpost responseString = " + responseString);
} catch (ClientProtocolException e) {
//handle it
} catch (IOException e) {
//handle it
} catch (IllegalStateException e) {
//handle it
} finally {
//handle it
}