我对 Android 比较陌生(我是一名 iOS 开发人员),我想使用 NSURLConnectionDelegate 的方法调用我在 iOS 中习惯的 Web 服务
didReceiveData:(NSData *)data
我需要以增量方式获取数据,因为我正在构建一个流式 API,该 API 会获取大量 JSON 数据作为响应,并且需要检查数据中的完整块。
如果有人可以帮助我,那就太好了,我一直在寻找一段时间,到目前为止还没有找到令人满意的解决方案。
我对 Android 比较陌生(我是一名 iOS 开发人员),我想使用 NSURLConnectionDelegate 的方法调用我在 iOS 中习惯的 Web 服务
didReceiveData:(NSData *)data
我需要以增量方式获取数据,因为我正在构建一个流式 API,该 API 会获取大量 JSON 数据作为响应,并且需要检查数据中的完整块。
如果有人可以帮助我,那就太好了,我一直在寻找一段时间,到目前为止还没有找到令人满意的解决方案。
如果您尝试在 Android 中调用 Web 服务,您应该使用AsyncTask
where the request
will be made asynchronously
。看看文档。每次您的请求完成时,onPostExecute(Object result)
都会调用该方法。这就是您可以继续进行进一步处理的方法。
URLConnection 文档包含以下示例:
URL url = new URL("ftp://mirror.csclub.uwaterloo.ca/index.html");
URLConnection urlConnection = url.openConnection();
InputStream in = new BufferedInputStream(urlConnection.getInputStream());
try {
readStream(in);
finally {
in.close();
}
如果我正确理解您的问题,只需根据需要实现 readStream 函数。
在朋友和一些链接的帮助下,我发现了如何做到这一点。
您需要像这样实现自己的 ResponseHandler:
class ChunkedResponseHandler implements ResponseHandler<String> {
@Override
public String handleResponse(HttpResponse response) throws ClientProtocolException, IOException {
HttpEntity entity = response.getEntity();
InputStream stream = entity.getContent();
StringBuffer output = new StringBuffer();
byte[] b = new byte[4096];
int n;
while ((n = stream.read(b)) != -1) {
output.append(new String(b, 0, n));
// do something while input is streaming
}
return output.toString();
}
}
现在您只需在启动请求时分配响应处理程序:
HttpClient client = new DefaultHttpClient();
HttpGet getRequest = new HttpGet("someURL");
ResponseHandler<String> responseHandler = new ChunkedResponseHandler();
String responseBody = client.execute(postRequest, responseHandler);