2016-12-24 73 views
0

我正在爲客戶端開發Android應用程序,我打電話給他們的API以獲取我應用程序各個部分的信息。如果我設置了超時,那麼在SocketTimeoutException上會產生一個調用,如果沒有,則會無限地掛起;但是,它在Web客戶端(React)上工作得很好,所以它不能成爲服務器。Android HTTPUrlConnection SocketTimeoutException /無限期掛起?

代碼:

package io.voluntu.voluntu; 

import android.os.AsyncTask; 
import android.os.Bundle; 

import org.json.JSONException; 
import org.json.JSONObject; 

import java.io.BufferedReader; 
import java.io.DataOutputStream; 
import java.io.IOException; 
import java.io.InputStreamReader; 
import java.net.HttpURLConnection; 
import java.net.MalformedURLException; 
import java.net.URL; 
import java.util.Arrays; 

public class SendApproveHours extends AsyncTask<Bundle, Void, String>{ 
    private StringBuilder sb = new StringBuilder(); 
    private String result; 
    private ApproveHours approveHours; 

    public SendApproveHours(ApproveHours approveHours){ 
     this.approveHours = approveHours; 
    } 

    protected String doInBackground(Bundle... params){ 
     Bundle b = params[0]; 
     String jwt = b.getString("JWT"); 
     System.out.println(jwt); 

     boolean approve = b.getBoolean("APPROVE"); 
     int[] id = b.getIntArray("ID"); 
     try { 
      URL url = new URL("http://voluntu.io/api/hour/update"); 
      HttpURLConnection httpURLConnection = (HttpURLConnection) url.openConnection(); 
      httpURLConnection.setConnectTimeout(2500 /* milliseconds */); //if i don't do this, it will hang indefinitely 
      httpURLConnection.setReadTimeout(1500 /* milliseconds */); 
      httpURLConnection.setDoOutput(true); 
      httpURLConnection.setRequestProperty("Content-Type", "application/json"); 
      httpURLConnection.setRequestProperty("Host", "voluntu.io"); 
      httpURLConnection.setRequestProperty("Origin", "http://voluntu.io"); 
      httpURLConnection.setRequestProperty("Referer", "http://voluntu.io/hours/approve"); 
      httpURLConnection.setRequestProperty("Cookie", "sessionJWT=" + jwt); 

      httpURLConnection.connect(); 

      JSONObject jsonObject = new JSONObject(); 
      jsonObject.put("approveOrReject", approve); 
      jsonObject.put("hourIDs", Arrays.toString(id)); 

      System.out.println(jsonObject); 

      DataOutputStream wr = new DataOutputStream(httpURLConnection.getOutputStream()); 
      wr.writeBytes(jsonObject.toString()); 
      wr.flush(); 
      wr.close(); 

      int HttpResult = httpURLConnection.getResponseCode(); //hangs here 
      System.out.println("HTTP RESULT: " + HttpResult); 
      if(HttpResult == HttpURLConnection.HTTP_OK){ 
       BufferedReader in = new BufferedReader(new InputStreamReader(
         httpURLConnection.getInputStream(), "utf-8" 
       )); 
       String line; 
       while((line = in.readLine()) != null){ 
        sb.append(line); 
       } 
       in.close(); 
      } 
      System.out.println("RESPONSE: " + sb.toString()); 
      httpURLConnection.disconnect(); 
     } 
     catch (MalformedURLException e){ 
      e.printStackTrace(); 
     } 
     catch (IOException e){ 
      e.printStackTrace(); 
     } 
     catch (JSONException e){ 
      e.printStackTrace(); 
     } 
     return sb.toString(); 
    } 

    protected void onPostExecute(String result){ 
     approveHours.refreshHours(); 
    } 
} 

它掛在得到的HTTP響應代碼的某些原因。我檢查了標題和正文,它們與Web版本發送的內容相同,所以我不知道爲什麼它不起作用。另外,調用其他API的API工作得很好,事實上這些代碼大部分都是從調用API的應用程序的其他部分複製粘貼的。幫助表示讚賞!

回答

0

我修好了。您必須使用JSONArray,而不是數組,而是在將數組放入JSON對象時將其包裝在引號中。