android 挂起,而 android 找不到连接
Posted
技术标签:
【中文标题】android 挂起,而 android 找不到连接【英文标题】:android is hang while android don't find connection 【发布时间】:2011-07-01 04:07:21 【问题描述】:我正在创建一个 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;
【问题讨论】:
【参考方案1】:您是否遇到了某种异常?如果 URL 格式不正确,您将收到 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
【讨论】:
【参考方案2】:看看这个How to set HttpResponse timeout for Android in Java。而且您真的应该在单独的线程/AsyncTask 中而不是在主线程中进行所有网络通信。
【讨论】:
【参考方案3】:如果您的模拟器上的 UI 挂起,您可能会在 UI 线程上执行网络操作 - 这将阻止所有 UI 操作,直到网络操作完成。在此处阅读如何在线程中运行此代码: http://developer.android.com/resources/articles/painless-threading.html
【讨论】:
【参考方案4】:您还应该考虑定义一个超时时间(例如 5 秒),以便系统不会长时间尝试连接到无法访问的服务器。
final HttpParams httpParams = httpClient.getParams();
HttpConnectionParams.setConnectionTimeout(httpParams, 5000);
HttpConnectionParams.setSoTimeout(httpParams, 5000);
【讨论】:
我应该在哪里写这段代码.. 在登录方法的 try 块中??httpClient
初始化后就可以写了。无需在每个请求上设置它。考虑使其可配置(通过属性/首选项)。以上是关于android 挂起,而 android 找不到连接的主要内容,如果未能解决你的问题,请参考以下文章
Android UI 在 JDBC 连接上挂起 - 即使连接在另一个线程上