【问题标题】:HttpURLConnection android contentLength = -1HttpURLConnection 安卓内容长度 = -1
【发布时间】:2014-09-16 16:47:58
【问题描述】:

我正在尝试借助 php 脚本获取数据。我正在使用 HttpURLConnection 和 GET 方法。这里奇怪的是问题只发生在android上。我刚刚在 eclipse for 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。因此,“new char[contentLength]”这一行被 catch 块捕获。 BASE_URL 常量是包含脚本的在线 url 文件夹。当它指向本地主机时,一切都很好。

这是方法调用:

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" />

有什么想法吗?谢谢。

【问题讨论】:

  • 你能捕捉到错误并记录下来,以便检查连接创建错误(如果有的话)吗?
  • 好吧,没有可见的连接错误.. responseCode == 200。这是日志:1542-1564/be.simongenin.unbunker E/UnBunkerDebug:错误:-1。

标签: android httpurlconnection


【解决方案1】:

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

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-04-09
    • 1970-01-01
    • 1970-01-01
    • 2011-10-27
    • 2011-01-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多