Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/228.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
真正显示java outputstream进度和超时_Java_Android_Networking_Outputstream - Fatal编程技术网

真正显示java outputstream进度和超时

真正显示java outputstream进度和超时,java,android,networking,outputstream,Java,Android,Networking,Outputstream,我觉得这是一个应该解决的问题。我正在编写的一个Android应用程序发送一条类似于SMS的消息,用户可以在其中附加一个文件。我使用HttpUrlConnection将这些数据发送到我的服务器,该服务器基本上可以归结为一个java.io.OutputStream(我将其包装在一个DataOutputStream中) 在移动设备上,有时网络连接会非常糟糕,发送时间可能太长。我有以下两个基本问题: 用户无法知道上载的进度 如果网络很糟糕,进展也很糟糕,我宁愿放弃,或者有一些合理的超时时间,也不愿坐在那

我觉得这是一个应该解决的问题。我正在编写的一个Android应用程序发送一条类似于SMS的消息,用户可以在其中附加一个文件。我使用HttpUrlConnection将这些数据发送到我的服务器,该服务器基本上可以归结为一个java.io.OutputStream(我将其包装在一个DataOutputStream中)

在移动设备上,有时网络连接会非常糟糕,发送时间可能太长。我有以下两个基本问题:

  • 用户无法知道上载的进度
  • 如果网络很糟糕,进展也很糟糕,我宁愿放弃,或者有一些合理的超时时间,也不愿坐在那里尝试5-10分钟
  • 问题1:

    我尝试根据我正在使用4K缓冲区执行的outputstream write()调用显示上载进度:

            buffer = new byte[4096];
            long totalBytes = 0;
            while ((bytesRead = fis.read(buffer)) > -1) {
                totalBytes += bytesRead;
                dos.write(buffer, 0, bytesRead);
                if(showProgress){
                   updateProgressBar(totalBytes);
                }
            }
    
    虽然这向我展示了进展,但它似乎只是向我展示了应用程序将文件缓冲区传输到操作系统网络堆栈缓冲区的速度。即使在网络速度较慢的情况下,进度条也会很快完成,然后在我最终从服务器返回JSON并告诉我发送状态之前,进度条还会在那里停留很长时间。从我把它传递给操作系统到服务器告诉我它收到了它,肯定有办法取得一些进展吗

    问题2:

    有时网络连接不好,但还不够差,硬件无线电会触发回调,以查找不到连接(在本例中,我进入脱机模式)。因此,当情况不好但没有关闭时,我的应用程序将只是坐在发送对话框旁,直到奶牛回家。这与问题1有关,因为OutputStream本机不提供超时机制,所以我需要知道实际吞吐量。如果它低于某个阈值,我可以取消连接,并通知用户,他们需要去一个接收良好的地方

    旁注:异步发送/输出队列对我来说不是一个选项,因为我无法将消息持久化到磁盘,因此无法保证起草的消息在以后某个时间无法发送时是无限期的。我需要/想要阻止发送,我只需要更聪明地放弃和/或告知用户正在发生的事情

    它似乎只是向我展示了应用程序将文件缓冲区传输到操作系统网络堆栈缓冲区的速度

    比那更糟。它显示了应用程序将数据传输到其正在写入的
    HttpURLConnection
    内部
    ByteArrayOutputStream
    ,以便在写入任何内容之前查看内容长度并设置标题的速度

    幸运的是,它也比这更好。如果您事先知道数据的长度,请设置固定长度传输模式。如果没有,请将chunked传输模式设置为较低的块大小,如1024

    然后,您将看到应用程序将数据移动到套接字发送缓冲区的速度有多快;在分块传输模式下,以分块大小为单位。但是,一旦套接字发送缓冲区填满,您的写操作就会阻塞,您将看到实际的网络传输,至少在您完成最后一次写操作之前是这样。从那时起,写入和关闭都是异步的,所以您的显示会更早地弹出,但每个人都有这个问题

    关于问题2,一旦传输稳定到上述网络速度,您就可以计算自己的吞吐量,如果吞吐量很低,可以做出相应的反应