【问题标题】:Android HTTPUrlConnection SocketTimeoutException/Indefinite Hang?Android HTTPUrlConnection SocketTimeoutException/无限期挂起?
【发布时间】:2016-12-24 04:07:49
【问题描述】:

我正在为客户开发一个 Android 应用程序,我正在调用他们的 API 来获取我的应用程序各个部分的信息。如果我设置超时,则有一个调用会导致 SocketTimeoutException,否则会无限挂起;但是,它在 Web 客户端(React)上工作得很好,所以它不能是服务器。

代码:

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 响应代码。我检查了标题和正文,它们与网络版本发送的内容相同,所以我不知道为什么它不起作用。此外,调用他们 API 的其他部分也可以正常工作,事实上,这段代码主要是从我的应用程序调用 API 的其他部分复制粘贴的。感谢您的帮助!

【问题讨论】:

    标签: java android json http post


    【解决方案1】:

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

    【讨论】:

      猜你喜欢
      • 2017-06-29
      • 2011-05-07
      • 2021-04-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-04-29
      • 2019-08-01
      • 1970-01-01
      相关资源
      最近更新 更多