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 响应的主要内容,如果未能解决你的问题,请参考以下文章

Android 如何像在 iOS 中一样广播 BLE 本地名称?

Swift3 如何像在 android 中一样在 iOS 中实现底部工作表

如何像在 iOS 中为 iMessage 一样为 Android 创建贴纸包?

如何在 Android 中像在 Google 地图中一样获得持续的位置更新?

我们可以像在 android asyncTask 中一样显示加载状态,直到我们在 swift 中使用 HTTP Post 请求得到响应

如何在iOS 7上的UITableViewCell左侧获得复选标记,就像在设置中一样?