2012-02-20 15 views
2

WCFサービスをデバッグする際にこの問題が発生しました。私はサービスと通信するHttpURLConnectionを使用します。サービスのデバッグ中に、Androidアプリケーションが応答を待っている間にサーバーを停止して、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を持っています。問題は何らかの理由で、キャッチしているExceptionオブジェクト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

デバッガはキャッチブロックを破壊していませんでした。 –

関連する問題