Java Android HTTPUrlConnection SocketTimeoutException/无限挂起?

Java Android HTTPUrlConnection SocketTimeoutException/无限挂起?,java,android,json,http,post,Java,Android,Json,Http,Post,我正在为一个客户端开发一个Android应用程序,我正在调用他们的API来获取我应用程序各个部分的信息。有一个调用,如果我设置了超时,则会导致SocketTimeoutException,如果我没有设置超时,则会无限挂起;但是,它在web客户机(React)上运行良好,因此它不能作为服务器 代码: 包io.voluntu.voluntu; 导入android.os.AsyncTask; 导入android.os.Bundle; 导入org.json.JSONException; 导入org.js

我正在为一个客户端开发一个Android应用程序,我正在调用他们的API来获取我应用程序各个部分的信息。有一个调用,如果我设置了超时,则会导致SocketTimeoutException,如果我没有设置超时,则会无限挂起;但是,它在web客户机(React)上运行良好,因此它不能作为服务器

代码:

包io.voluntu.voluntu;
导入android.os.AsyncTask;
导入android.os.Bundle;
导入org.json.JSONException;
导入org.json.JSONObject;
导入java.io.BufferedReader;
导入java.io.DataOutputStream;
导入java.io.IOException;
导入java.io.InputStreamReader;
导入java.net.HttpURLConnection;
导入java.net.MalformedURLException;
导入java.net.URL;
导入java.util.array;
公共类SendApproveHours扩展异步任务{
私有StringBuilder sb=新StringBuilder();
私有字符串结果;
私人批准时间批准时间;
公共发送批准小时数(批准小时数批准小时数){
this.approveHours=approveHours;
}
受保护的字符串doInBackground(捆绑…参数){
束b=参数[0];
字符串jwt=b.getString(“jwt”);
系统输出打印LN(jwt);
boolean approve=b.getBoolean(“approve”);
int[]id=b.getIntArray(“id”);
试一试{
URL=新URL(“http://voluntu.io/api/hour/update");
HttpURLConnection HttpURLConnection=(HttpURLConnection)url.openConnection();
httpURLConnection.setConnectTimeout(2500/*毫秒*/);//如果我不这样做,它将无限期挂起
httpURLConnection.setReadTimeout(1500/*毫秒*/);
httpURLConnection.setDoOutput(true);
setRequestProperty(“内容类型”、“应用程序/json”);
setRequestProperty(“主机”,“voluntu.io”);
httpURLConnection.setRequestProperty(“原点”http://voluntu.io");
httpURLConnection.setRequestProperty(“Referer”http://voluntu.io/hours/approve");
httpURLConnection.setRequestProperty(“Cookie”、“sessionJWT=“+jwt”);
httpURLConnection.connect();
JSONObject JSONObject=新的JSONObject();
jsonObject.put(“approveOrReject”,approve);
jsonObject.put(“hourIDs”,Arrays.toString(id));
System.out.println(jsonObject);
DataOutputStream wr=新的DataOutputStream(httpURLConnection.getOutputStream());
writeBytes(jsonObject.toString());
wr.flush();
wr.close();
int-HttpResult=httpURLConnection.getResponseCode();//挂起在这里
System.out.println(“HTTP结果:+HttpResult”);
if(HttpResult==HttpURLConnection.HTTP\u确定){
BufferedReader in=新的BufferedReader(新的InputStreamReader(
httpURLConnection.getInputStream(),“utf-8”
));
弦线;
而((line=in.readLine())!=null){
某人附加(行);
}
in.close();
}
System.out.println(“响应:+sb.toString());
httpURLConnection.disconnect();
}
捕获(格式错误){
e、 printStackTrace();
}
捕获(IOE异常){
e、 printStackTrace();
}
捕获(JSONException e){
e、 printStackTrace();
}
使某人返回字符串();
}
受保护的void onPostExecute(字符串结果){
approveHours.refreshHours();
}
}

出于某种原因,它需要获取HTTP响应代码。我检查了标题和正文,它们与web版本发送的内容相同,所以我不知道为什么它不起作用。另外,调用他们API的其他部分也很好,事实上,这些代码大部分是从我的应用程序调用API的其他部分复制粘贴的。谢谢你的帮助

我把它修好了。您必须使用JSONArray,而不是数组,否则当数组放入JSON对象时,它会被用引号括起来

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();
    }
}