我试图通过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" />
有什么想法?谢谢。
答案 0 :(得分:0)
connection.getContentLength()
不是查找响应流中字节数的可靠方法。原因是:
Tranfer-Encoding: chunked
标头,这是HTTP / 1.1响应的典型标头。 在这两种情况下,最好的方法是读取流,直到它耗尽为止。
BufferedReader br = new BufferedReader(reader);
StringBuilder sb = new StringBuilder();
while ((line = br.readLine()) != null) {
sb.append(line);
}
processJson(sb.toString());