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

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

didReceiveData:(NSData *)data

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

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

【问题讨论】:

    标签: android ios json streaming httprequest


    【解决方案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);
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2022-06-28
        • 2016-01-01
        相关资源
        最近更新 更多