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 NDK 堆栈跟踪

Android UI 在 JDBC 连接上挂起 - 即使连接在另一个线程上

Kotlin 类的 Android 单元测试因“找不到符号类...”而失败

Linux蓝牙找不到带有UUID的Android服务

Android Studio 运行找不到夜神模拟器

Android自签名证书:找不到证书路径的信任锚