(Android) 从 Socket Outputstream.write() 获取上传进度?
(Android) Get upload progress from Socket Outputstream.write()?
我正在制作一个 Android 应用程序来将文件从设备传输到计算机上的 Java 应用程序。它的工作原理是它可以将文件发送到计算机,但在发送时它有一个 ProgressDialog
。该对话框 不是 用于监视 从 SD 卡读取 的进度,而是 上传到服务器的进度。到目前为止,我的搜索只能从 SD 卡或网页中读取。
为了上传,我使用了用 socket.getOutputStream();
创建的简单 OutputStream
。我的代码如下:
protected void onProgressUpdate(Integer... values) {
mProgressDialog.setIndeterminate(false);
mProgressDialog.setProgress(progress);
}
@Override
protected String doInBackground(String[] params) {
String IP = params[1];
File myFile = new File(params[0]);
int count;
try {
long total = 0;
Socket socket = new Socket(IP, 25000);
byte[] buffer = new byte[(int) myFile.length()];
FileInputStream fis = new FileInputStream(myFile);
BufferedInputStream in = new BufferedInputStream(fis);
OutputStream out = socket.getOutputStream(); // THIS IS MY OUTPUTSTREAM
while((count = in.read(buffer, 0, buffer.length)) != -1) {
total += count;
progress = (int) (count);
publishProgress();
out.write(buffer, 0, buffer.length);
Log.i("TOTAL", Long.toString(total));
Log.i("Upload progress", "" + (int) ((total * 100) / buffer.length));
}
out.flush();
out.close();
in.close();
socket.close();
} catch(Exception ex) {
ex.printStackTrace();
Log.i("TAG", "Failed to send file");
}
return "test";
}
根据我对文档和其他论坛的研究,似乎 OutputStream 没有 return 任何方法。这很麻烦,因为我需要 return 它在上传时的当前状态。
截至目前,无论文件大小如何,进度对话框都会立即从 0 变为最大(实际这样做需要更长的时间)。我不知道是什么原因造成的,但这不是重点。
如何使用 OutputStream 监控文件的上传进度?这可以吗?
提前致谢。
你的问题是你创建了文件大小的缓冲区:
byte[] buffer = new byte[(int) myFile.length()];
所以你的循环只通过了 1 次,因为足够 space 数据
while((count = in.read(buffer, 0, buffer.length)) != -1)
你需要这样改变:
byte[] buffer = new byte[256];
我正在制作一个 Android 应用程序来将文件从设备传输到计算机上的 Java 应用程序。它的工作原理是它可以将文件发送到计算机,但在发送时它有一个 ProgressDialog
。该对话框 不是 用于监视 从 SD 卡读取 的进度,而是 上传到服务器的进度。到目前为止,我的搜索只能从 SD 卡或网页中读取。
为了上传,我使用了用 socket.getOutputStream();
创建的简单 OutputStream
。我的代码如下:
protected void onProgressUpdate(Integer... values) {
mProgressDialog.setIndeterminate(false);
mProgressDialog.setProgress(progress);
}
@Override
protected String doInBackground(String[] params) {
String IP = params[1];
File myFile = new File(params[0]);
int count;
try {
long total = 0;
Socket socket = new Socket(IP, 25000);
byte[] buffer = new byte[(int) myFile.length()];
FileInputStream fis = new FileInputStream(myFile);
BufferedInputStream in = new BufferedInputStream(fis);
OutputStream out = socket.getOutputStream(); // THIS IS MY OUTPUTSTREAM
while((count = in.read(buffer, 0, buffer.length)) != -1) {
total += count;
progress = (int) (count);
publishProgress();
out.write(buffer, 0, buffer.length);
Log.i("TOTAL", Long.toString(total));
Log.i("Upload progress", "" + (int) ((total * 100) / buffer.length));
}
out.flush();
out.close();
in.close();
socket.close();
} catch(Exception ex) {
ex.printStackTrace();
Log.i("TAG", "Failed to send file");
}
return "test";
}
根据我对文档和其他论坛的研究,似乎 OutputStream 没有 return 任何方法。这很麻烦,因为我需要 return 它在上传时的当前状态。
截至目前,无论文件大小如何,进度对话框都会立即从 0 变为最大(实际这样做需要更长的时间)。我不知道是什么原因造成的,但这不是重点。
如何使用 OutputStream 监控文件的上传进度?这可以吗?
提前致谢。
你的问题是你创建了文件大小的缓冲区:
byte[] buffer = new byte[(int) myFile.length()];
所以你的循环只通过了 1 次,因为足够 space 数据
while((count = in.read(buffer, 0, buffer.length)) != -1)
你需要这样改变:
byte[] buffer = new byte[256];