2011-03-02 37 views
2

我正在尝试获取Apache HTTP客户端执行方法的进度。是否有可能要么监视输入流/ httpclient.exectute的进度

  1. 获取输入流的安装已读通过一些内部方法或者通过百分比或数据量的执行方法 或
  2. 监控执行过程中发送?

下面的代码发送一个输入流到服务器(在这种情况下是一个图像),然后适当地存储。问题在于高分辨率照相机和慢速移动运营商很难判断上传是否真正发生。代码确实有用,但需要反馈。

public List writeBinary(String script, InputStream lInputStream) { 
     Log.d(Global.TAG,"-->writing to server..."); 

     HttpParams httpParameters = new BasicHttpParams(); 
     HttpConnectionParams.setConnectionTimeout(httpParameters, 5*1000); 
     HttpConnectionParams.setSoTimeout(httpParameters, 60*1000); 

     HttpClient httpclient = new DefaultHttpClient(httpParameters); 
     HttpPost httppost = new HttpPost("http://xxx.xxx.xxx.xxx" + script); 

     String responseText = null; 
     List responseArray = new ArrayList(); 

     try { 
      httppost.setEntity(new InputStreamEntity(lInputStream, -1)); 
      HttpResponse response = httpclient.execute(httppost); 

      if (response.getStatusLine().getStatusCode() == 200){ 
       InputStream lInputStreamResponse = response.getEntity().getContent(); 
       DataInputStream lDataInputStream = new DataInputStream(lInputStreamResponse); 
       BufferedReader lBufferReader = new BufferedReader(new InputStreamReader(lDataInputStream)); 

       while ((responseText = lBufferReader.readLine()) != null){ 
        responseArray.add(responseText); 
       } 

       lInputStream.close(); 
      } 

     } catch (ClientProtocolException e) { 
      e.printStackTrace(); 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } 

     return responseArray; 
    } 

回答

2

我更喜欢“装饰”流/读者/写者对象一点点,添加所需的进度功能。在装饰流/读写器中,您可以保留一个计数器来指示进度,甚至可以将指标回调放入其中。 ;-)

事情是这样的:

public Class CountableOutputStream implements OutputStream { 
    private int counter; 
    private OutputStream origStream; 
    ...... 
} 

事实上,整个的Java IO包演示这种设计模式相当好。