HttpURLConnection android contentLength = -1

时间:2014-09-16 16:47:59

标签: android httpurlconnection

我试图通过php脚本获取数据。我正在使用HttpURLConnection和GET方法。这里的奇怪之处在于问题只发生在android上。我刚刚在eclipse上尝试了java,它运行得很好。当我在我的本地主机上时它也常常工作。不,我试图从在线服务器获取数据,它在模拟器和设备上都不再起作用。

这里的功能是:

public static JSONArray getData(String scriptName)  {

    int responseCode = -1;
    JSONArray jsr = null;

    try {
        URL feedURL = new URL(BASE_URL + scriptName + ".php");
        HttpURLConnection connection = (HttpURLConnection) feedURL.openConnection();
        connection.setReadTimeout(10000/* milliseconds */);
        connection.setRequestMethod("GET");
        connection.setDoInput(true);
        connection.connect();

        responseCode = connection.getResponseCode();
        if (responseCode == HttpURLConnection.HTTP_OK) {

            InputStream inputStream = connection.getInputStream();
            Reader reader = new InputStreamReader(inputStream);
            int contentLength = connection.getContentLength();
            char[] charArray = new char[contentLength];
            reader.read(charArray);
            String responseData = new String(charArray);

            jsr = new JSONArray(responseData);

        }

    } catch (Exception e) {
        Log.e(UnBunkerApplication.DEBUG_TAG, "Error : " + e.getMessage());
    }

    return jsr;
}

生成的错误是connection.getContentLength()返回-1。因此,"新的char [contentLength]被捕获集团捕获。 BASE_URL常量是包含脚本的在线url文件夹。当它在pohost to localhost时,一切都很好。

这是方法调用:

public static void fillUsersListFromDataBase() {
    Thread t = new Thread(new Runnable() {
        @Override
        public void run() {
            JSONArray dataJSON = DataBase.getData("getAllUsers");
            User.fillUsers(dataJSON);
        }

    });

    t.start();

    try {
        t.join();
    } catch (InterruptedException e) {
        e.printStackTrace();
    }
}

以下是权限:

<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.SEND_SMS" />

有什么想法?谢谢。

1 个答案:

答案 0 :(得分:0)

connection.getContentLength()不是查找响应流中字节数的可靠方法。原因是:

  1. 响应可以压缩/压缩。
  2. 响应可能是使用Tranfer-Encoding: chunked标头,这是HTTP / 1.1响应的典型标头。
  3. 看起来你假设1个字节= 1个字符并创建一个字节数的字符数组。鉴于您的服务器可能正在发送多个字节字符(例如utf-8)
  4. ,这并不总是正确的

    在这两种情况下,最好的方法是读取流,直到它耗尽为止。

    BufferedReader br = new BufferedReader(reader); 
    StringBuilder sb = new StringBuilder(); 
    while ((line = br.readLine()) != null) {
          sb.append(line);
    }
    processJson(sb.toString());