Android:像在 iOS 中一样逐步获取 HTTP 响应

Posted

技术标签:

【中文标题】Android:像在 iOS 中一样逐步获取 HTTP 响应【英文标题】:Android: Getting HTTP response incrementally like in iOS 【发布时间】:2013-10-14 13:31:44 【问题描述】:

我对 android 比较陌生(我是一名 ios 开发人员),我想像在 iOS 中使用 NSURLConnectionDelegate 的方法一样调用 Web 服务

didReceiveData:(NSData *)data

我需要以增量方式获取数据,因为我正在构建一个流式 API,该 API 会获取大量 JSON 数据作为响应,并且需要检查数据中的完整块。

如果有人可以帮助我,那就太好了,我已经搜索了一段时间,到目前为止还没有找到令人满意的解决方案。

【问题讨论】:

【参考方案1】:

如果您尝试在 Android 中调用 Web 服务,您应该使用 AsyncTask,其中 request 将变为 asynchronously。看看the documentation。每次您的请求完成时,都会调用 onPostExecute(Object result) 方法。这就是您可以继续进行进一步处理的方法。

【讨论】:

是的,我已经知道这一点,并且我的请求已经在 AsyncTask 内部实现。但我正在寻找的是一个回调方法,它在请求仍在运行时返回已经收到的数据。【参考方案2】:

URLConnection documentation 包含以下示例:

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 函数。

【讨论】:

【参考方案3】:

在朋友的帮助和一些链接的帮助下,我发现了如何做到这一点。

你需要像这样实现一个自己的 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);

【讨论】:

以上是关于Android:像在 iOS 中一样逐步获取 HTTP 响应的主要内容,如果未能解决你的问题,请参考以下文章