2012-02-20 7 views
2

WCF 서비스를 디버깅하는 동안이 문제가 발생했습니다. 나는 서비스와 통신하는 HttpURLConnection을 사용한다. 서비스를 디버깅하는 동안 Android 응용 프로그램이 응답을 기다리는 동안 서버를 중지해야하는 문제가 발생하여 Android 응용 프로그램이 예기치 않게 중지되었습니다.서버 연결이 끊어지면 안드로이드 응용 프로그램이 충돌 함

예기치 않게 갑자기 서버를 중단하고 안드로이드 클라이언트를 정상적으로 처리하는 가장 좋은 방법은 무엇입니까?

@Override 
    protected JSONObject doInBackground(BLHttpJSONPostModel ...models) { 
     JSONObject jsonObject = null; 

     BLHttpJSONPostModel postModel = models[0]; 
     URL url = null; 
     byte[] postData = null; 
     String protocol = null; 
     String response = null; 
     InputStream responseStream = null; 
     OutputStream outStream = null; 
     HttpURLConnection connection = null; 
     BufferedReader bufferedReader = null; 
     StringBuilder builder = null; 

     try { 
      url = new URL(postModel.getUrlString()); 
      postData = postModel.getPostDataAsJsonObject().toString().getBytes(); 
      protocol = url.getProtocol(); 
     } catch (MalformedURLException e1) { 
      e1.printStackTrace(); 
      return null; 
     } 

     if (protocol.equals("https")) { 
      connection = this.setUpHttps(url); // establishes a secure connection if protocol is HTTPS 
     } 
     else if (protocol.equals("http")) { 
      try { 
       connection = (HttpURLConnection)url.openConnection(); // establishes un-secured connection 
      } catch (IOException e) { 
       e.printStackTrace(); 
       return null; 
      } 
     } 
     else 
      return null; // handles unsupported protocol 

     try { 
      connection.setRequestProperty("Content-Length", String.valueOf(postData.length)); 
      connection.setRequestProperty("CONTENT-TYPE", "application/json"); 
      connection.setRequestMethod("POST"); 
      connection.setUseCaches(false); 
      connection.setDoInput(true); 
      connection.setDoOutput(true); 
      connection.connect(); 
      outStream = connection.getOutputStream(); 
      outStream.write(postData); 
      outStream.close(); 

      String _type = connection.getContentType();   // for debugging only 
      String _message = connection.getResponseMessage(); // "" 
      int size = connection.getContentLength();   // "" 

      bufferedReader = new BufferedReader(new InputStreamReader(connection.getInputStream(), "UTF-8")); 
      builder = new StringBuilder(); 

      while((response = bufferedReader.readLine()) != null) { 
       builder.append(response); 
      } 
     } catch (IOException e) { 
      e.printStackTrace(); // no exceptio caught here 
     } finally { 
      connection.disconnect(); 
     } 

     if ((builder != null) && (! builder.toString().equals(""))) { 
      try { 
       jsonObject = new JSONObject(builder.toString()); 
      } catch (JSONException e) { 
       e.printStackTrace(); 
      } 
     } 

     return jsonObject; 
    } 

스택 추적 : 나는 너무 자주이 문제를 직면

02-20 12:13:33.935: E/AndroidRuntime(1173): FATAL EXCEPTION: AsyncTask #1 
02-20 12:13:33.935: E/AndroidRuntime(1173): java.lang.RuntimeException: An error occured while executing doInBackground() 
02-20 12:13:33.935: E/AndroidRuntime(1173):  at android.os.AsyncTask$3.done(AsyncTask.java:200) 
02-20 12:13:33.935: E/AndroidRuntime(1173):  at java.util.concurrent.FutureTask$Sync.innerSetException(FutureTask.java:273) 
02-20 12:13:33.935: E/AndroidRuntime(1173):  at java.util.concurrent.FutureTask.setException(FutureTask.java:124) 
02-20 12:13:33.935: E/AndroidRuntime(1173):  at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:307) 
02-20 12:13:33.935: E/AndroidRuntime(1173):  at java.util.concurrent.FutureTask.run(FutureTask.java:137) 
02-20 12:13:33.935: E/AndroidRuntime(1173):  at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1068) 
02-20 12:13:33.935: E/AndroidRuntime(1173):  at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:561) 
02-20 12:13:33.935: E/AndroidRuntime(1173):  at java.lang.Thread.run(Thread.java:1096) 
02-20 12:13:33.935: E/AndroidRuntime(1173): Caused by: java.lang.NullPointerException 
02-20 12:13:33.935: E/AndroidRuntime(1173):  at java.io.Reader.<init>(Reader.java:65) 
02-20 12:13:33.935: E/AndroidRuntime(1173):  at java.io.InputStreamReader.<init>(InputStreamReader.java:93) 
02-20 12:13:33.935: E/AndroidRuntime(1173):  at com.beslogic.remotpayment.connection.PostJSONTask.doInBackground(PostJSONTask.java:136) 
02-20 12:13:33.935: E/AndroidRuntime(1173):  at com.beslogic.remotpayment.connection.PostJSONTask.doInBackground(PostJSONTask.java:1) 
02-20 12:13:33.935: E/AndroidRuntime(1173):  at android.os.AsyncTask$2.call(AsyncTask.java:185) 
02-20 12:13:33.935: E/AndroidRuntime(1173):  at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:305) 
02-20 12:13:33.935: E/AndroidRuntime(1173):  ... 4 more 
+0

스택 추적을 캡처 했습니까? –

+0

@NickCampion 스택 추적으로 업데이트되었습니다. –

답변

1

대답은 훨씬 간단했습니다 (일반적으로 그렇듯이).

BufferedReader이 인스턴스화 된 경우 연결이 끊어 졌으므로 connection.getInputStream()이 null을 반환했습니다.

이 있어야한다 :이 잡히지되지 않은 런타임 예외를 던지고

responseStream = connection.getInputStream(); 

if (responseStream != null) { 
    bufferedReader = new BufferedReader(new InputStreamReader(responseStream, "UTF-8")); 
    builder = new StringBuilder(); 

    while((response = bufferedReader.readLine()) != null) { 
     builder.append(response); 
    } 
} 

.

1

나는 AsyncTask를 통해 백그라운드에서 작업 요청/respone 있습니다. 문제는 (어떤 이유로) 예외 객체 e이 잡을 수 있다는 것이 null 일 수 있다는 것입니다. 당신의 try catch 문에서 다음을 수행하십시오

try { 
    // Network code 
} catch(Exception e) { 
    if(e != null) { 
     e.printStackTrace(); 
    } else { 
     Log.i(appLogTag, "Error: I/O Error"); 
    } 
} 

모두 try ... catch 블록을 수행. 나는 지금 내 솔루션이 우스꽝 스럽다는 것을 안다.하지만 나는 당신이 똑같은 문제에 직면하고 있다고 생각하기에 충분할 때까지 자주이를 직면했다.

+0

디버거가 catch 블록을 손상시키지 않았습니다. –

관련 문제