【问题标题】:FTP progress bar uploading fileFTP进度条上传文件
【发布时间】:2012-08-09 12:37:45
【问题描述】:

大家好,我正在使用 apache.commons.net 将我的文件从 sd 卡上传到由文件 zilla 创建的 ftp 服务器。但是,我要做的就是向用户展示进度。请你帮助我好吗? 这是我的代码:

http://pastie.org/4433482

【问题讨论】:

  • 请提供更多信息,在此处粘贴您的代码等
  • 是的。我可以提供的唯一信息是我的条形图在 3 秒内从 0 开始上升到 100,但在这之间没有任何内容显示给用户,我将发布我的代码。
  • 真的我认为你应该为此使用处理程序。您正在使用 http、json 的代码应该在另一个线程上并且远离主 GUI 线程
  • @t0mm13b 我没有完全理解你。
  • 您需要检查的一件事 - 您可以通过修改第 324 行并在方法顶部添加 @Override 注释来确认,然后放入 Log.d 方法调用以查看是否logcat 确实会收到垃圾邮件吗? 你真的想过吗?

标签: java android ftp progress-bar


【解决方案1】:

如果您还没有解决问题。我认为问题出在这条线上 发布进度

((int) ((totalBytesTransferred/file.length())*100))

试试这个

publishProgress((int) ((totalBytesTransferred * 100)/file.length()))

【讨论】:

    【解决方案2】:

    这行有问题:

    publishProgress((int) ((totalBytesTransferred/file.length())*100));
    

    由于 totalBytesTransferred 是 long 且 File.length() 返回 long,因此将执行整数除法。所以这一行将返回零,直到 totalBytesTransferred 等于 file.length()。然后它将返回 100。

    您可以在除以之前将 totalBytesTransferred 转换为 double 以获得百分比:

    publishProgress((int) (((double)totalBytesTransferred/file.length())*100));
    

    【讨论】:

    • 是的,两者都很长(对不起,我看错了),但我的观点仍然成立 - 这将是一个整数除法。例如,您可以在除法之前将其转换为加倍。我会编辑答案...
    • 但是 publishProgress 方法应该有一个 int 值来执行兄弟
    • 让它保持整数除法并更改顺序:publishProgress((int) ((totalBytesTransferred*100)/file.length()));
    • ekholm 所说的问题是:50/100 f.e.结果为 0.5,因为这是一个整数除法,它将被转换为整数并四舍五入为 0。0 * 100 保持 0
    • @Kostronor 没有任何改变抱歉。
    【解决方案3】:

    在您粘贴的第 322 行。

    org.apache.commons.net.io.Util.copyStream(stO, stD, ftpClient.getBufferSize(),
          CopyStreamEvent.UNKNOWN_STREAM_SIZE,
          new CopyStreamAdapter() {
              public void bytesTransferred(
                       long totalBytesTransferred,
                       int bytesTransferred,
                       long streamSize) {
                          // Your progress Control code here
                          Log.d("CopyStreamAdapter", "bytesTransferred(...) - " +
                                totalBytesTransferred + "; " +
                                bytesTransferred + "; " + 
                                streamSize);
                          publishProgress((int) ((totalBytesTransferred/file.length())*100));
                       }
               }
          );
    

    我怀疑这是它失败的地方!如果你没有得到任何带有字符串“CopyStreamAdapter”的logcat,这意味着你的处理程序没有被解雇!

    【讨论】:

    • 我没有得到任何东西我该怎么办?
    • 阅读这个 - commons.apache.org/net/api-3.1/org/apache/commons/net/io/…, java.io.OutputStream, int, long, org.apache.commons.net.io.CopyStreamListener) - 注意 CopyStreamListener - 你正在使用 CopyStreamAdapter....
    • @tOmm13b 你的意思是我应该改变它吗?
    • 好吧,你最好的办法就是尝试看看你的表现如何,你会从中学到很多东西——调试、测试和观察logcat!
    • 让我们看看!我希望我能找到解决方案。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-02-24
    • 1970-01-01
    • 1970-01-01
    • 2014-08-26
    相关资源
    最近更新 更多