Tôi có một ứng dụng khách Android giao tiếp với máy chủ thông qua thiết bị đầu cuối REST-ful và JSON. Bởi vì điều này, tôi có nhu cầu truy xuất phản hồi máy chủ đầy đủ trước khi chuyển đổi nó thành một Hash. Tôi có mã này tại chỗ để làm điều đó (tìm thấy trên một nơi nào đó internet):Android: Chuyển đổi luồng thành chuỗi mà không cần hết bộ nhớ
private static String convertStreamToString(InputStream is) {
BufferedReader reader = new BufferedReader(new InputStreamReader(is));
StringBuilder sb = new StringBuilder();
String line = null;
try {
while ((line = reader.readLine()) != null) {
sb.append(line + "\n");
}
} catch (IOException e) {
e.printStackTrace();
} finally {
try {
is.close();
} catch (IOException e) {
e.printStackTrace();
}
}
return sb.toString();
}
Mã này hoạt động đối với hầu hết các phần, tuy nhiên tôi nhìn thấy những báo cáo về tai nạn trong lĩnh vực này từ các khách hàng với một ngoại lệ OutOfMemory trên dòng:
while ((line = reader.readLine()) != null) {
các vết đống đầy đủ là:
java.lang.RuntimeException: An error occured while executing doInBackground()
at android.os.AsyncTask$3.done(AsyncTask.java:200)
at java.util.concurrent.FutureTask$Sync.innerSetException(FutureTask.java:273)
at java.util.concurrent.FutureTask.setException(FutureTask.java:124)
at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:307)
at java.util.concurrent.FutureTask.run(FutureTask.java:137)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1068)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:561)
at java.lang.Thread.run(Thread.java:1102)
Caused by: java.lang.OutOfMemoryError
at java.lang.String.(String.java:468)
at java.lang.AbstractStringBuilder.toString(AbstractStringBuilder.java:659)
at java.lang.StringBuilder.toString(StringBuilder.java:664)
at java.io.BufferedReader.readLine(BufferedReader.java:448)
at com.appspot.myapp.util.RestClient.convertStreamToString(RestClient.java:303)
at com.appspot.myapp.util.RestClient.executeRequest(RestClient.java:281)
at com.appspot.myapp.util.RestClient.Execute(RestClient.java:178)
at com.appspot.myapp.$LoadProfilesTask.doInBackground(GridViewActivity.java:1178)
at com.appspot.myapp.$LoadProfilesTask.doInBackground(GridViewActivity.java:1)
at android.os.AsyncTask$2.call(AsyncTask.java:185)
at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:305)
... 4 more
câu hỏi của tôi: là có cách nào để giải quyết vấn đề này ngoài việc gửi những phần nhỏ hơn của dữ liệu từ máy chủ?
Cảm ơn!
Tôi không nhìn thấy sự cần thiết phải có toàn bộ phản ứng trong bộ nhớ cùng một lúc. Bạn có thể giải thích về điều đó không? –
Tôi đang sử dụng lớp org.json.JSONObject, chuẩn này có tiêu chuẩn với Android và thiếu API truyền trực tuyến. Nhưng, nó chỉ ra rằng Jackson có một API streaming mà tôi sẽ điều tra ... – esilver