【问题标题】:application crashes if the server is closed due to timeout. How can I catch it?如果服务器因超时而关闭,应用程序会崩溃。我怎么能抓住它?
【发布时间】:2013-09-18 22:55:13
【问题描述】:
            String urlStr = "nana.com/nana/api/v1"
            HttpURLConnection conn = null;
    BufferedReader rd = null;
    StringBuilder sb = null;
    try {
        URL url = new URL(urlStr);
        conn = (HttpURLConnection) url.openConnection();

        if (conn.getResponseCode() != 200) {
            throw new IOException(conn.getResponseMessage());
        }
        else {

        rd = new BufferedReader(new InputStreamReader(conn.getInputStream()));
        sb = new StringBuilder();
        String line;
        while ((line = rd.readLine()) != null) {
            sb.append(line);
        } 
        rd.close();

        conn.disconnect();
        }
    } catch (IOException i) {
        i.printStackTrace();
                    }catch (Exception e) {
        e.printStackTrace();

如果服务器处于活动状态并且正在工作,则此代码对我有用,但是当我关闭服务器时,它会超时并“意外”崩溃。我想要的只是应用程序在服务器无法访问时说出或显示警报对话框。 这是我的日志:

              09-14 11:52:57.702: E/AndroidRuntime(17256):  at android.os.Handler.dispatchMessage(Handler.java:99)
              09-14 11:52:57.702: E/AndroidRuntime(17256):  at                                     android.os.Looper.loop(Looper.java:130)
              09-14 11:52:57.702: E/AndroidRuntime(17256):  at android.app.ActivityThread.main(ActivityThread.java:3693)
              09-14 11:52:57.702: E/AndroidRuntime(17256):  at java.lang.reflect.Method.invokeNative(Native Method)
              09-14 11:52:57.702: E/AndroidRuntime(17256):  at java.lang.reflect.Method.invoke(Method.java:507)
              09-14 11:52:57.702: E/AndroidRuntime(17256):  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:907)
              09-14 11:52:57.702: E/AndroidRuntime(17256):  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:665)
              09-14 11:52:57.702: E/AndroidRuntime(17256):  at dalvik.system.NativeStart.main(Native Method)
              09-14 11:52:57.742: E/(179): Dumpstate > /data/log/dumpstate_app_error

【问题讨论】:

  • 你可以在这里发布 logcat 吗?
  • @VishalPawale 马上。
  • 您是否授予了 Internet 权限?你在主线程上做网络操作吗?
  • @VishalPawale 是的,一切都结束了。它们不是问题,问题是如果“没有”在线服务器可以连接,我应该怎么做才能让应用程序不崩溃。我怎样才能让应用程序说(“抱歉服务器已关闭”)
  • @VishalPawale 它也不是主线程。我只是想让它显示一条错误消息

标签: android tomcat connection timeout httpurlconnection


【解决方案1】:

请尝试以下方法

public String getData(String url) {

    HttpClient httpclient = new DefaultHttpClient(SetHttpParams.setHttp(
            50000, 50000));

    HttpGet httpget = new HttpGet(url);
    HttpResponse response;

    try {
        response = httpclient.execute(httpget);
        if (response.getStatusLine().getStatusCode() == 200) {
            org.apache.http.HttpEntity entity = response.getEntity();
            if (entity != null) {

                InputStream instream = entity.getContent();

                String res = Functions.convertStreamToString(instream);
            }
        }
    } catch (ConnectTimeoutException e) {
    } catch (SocketTimeoutException e) {
    } catch (IOException ex) {
    }
}

String res 是将存储响应的字符串。在 Asyntasks doinBackground() 方法中调用上述函数。放置一些本地布尔变量来检查是否发生异常。如果发生异常或继续您的工作,则在 onPostExecute() 中显示对话框。 希望对你有帮助。

【讨论】:

  • 感谢您提供翔实的回答,但我使用的是 httpurlconnection,您是否有机会为此举一个例子?
  • 你需要说为什么这一切都是一个答案。您还需要证明您明显建议使用空 catch 块以忽略某些异常。
  • @EJP:我在回答中说过放一些布尔值来检查是否发生异常,因此布尔值可以在异常块中分配,并且可以在 AsyncTask 的后执行方法中检查。如果我的代码有任何问题,请告诉我。
  • 换句话说,所有代码都不是答案:唯一的答案在最后一段。那么代码是干什么用的呢?
  • @EJP:Dennis Able 在这里看起来像个新手,所以只是用一些代码解释了他。
猜你喜欢
  • 2013-01-06
  • 1970-01-01
  • 2012-01-29
  • 2016-08-25
  • 2017-01-14
  • 2020-04-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多