我需要知道多少字节已经上传了更新进度条的Andr​​oid

我正在开发用于上传视频的阿帕奇/ PHP服务器一个应用程序。 在这一刻我已经可以上传视频。 我需要显示一个进度条,而该文件被上传。 我一直在使用的AsyncTask和HTTP 4.1.1库用于模拟形成下一个代码。

class uploadVideo extends AsyncTask<Void,Void,String>{ @Override protected String doInBackground(Void... params) { // Create a new HttpClient and Post Header HttpClient httpclient = new DefaultHttpClient(); HttpPost httppost = new HttpPost("http://www.youtouch.cl/videoloader/index.php"); try { // Add your data File input=new File(fileName); MultipartEntity multi=new MultipartEntity(HttpMultipartMode.BROWSER_COMPATIBLE); multi.addPart("video", new FileBody(input)); httppost.setEntity(multi); // Execute HTTP Post Request HttpResponse response = httpclient.execute(httppost); HttpEntity entity = response.getEntity(); BufferedReader reader = new BufferedReader( new InputStreamReader( entity.getContent(), "UTF-8")); String sResponse = reader.readLine(); return sResponse; } catch (ClientProtocolException e) { Log.v("Uri Galeria", e.toString()); e.printStackTrace(); } catch (IOException e) { Log.v("Uri Galeria", e.toString()); e.printStackTrace(); } return "error"; } @Override protected void onProgressUpdate(Void... unsued) { //Here I do should update the progress bar } @Override protected void onPostExecute(String sResponse) { try { if (pd.isShowing()) pd.dismiss(); if (sResponse != null) { JSONObject JResponse = new JSONObject(sResponse); int success = JResponse.getInt("SUCCESS"); String message = JResponse.getString("MESSAGE"); if (success == 0) { Toast.makeText(getApplicationContext(), message, Toast.LENGTH_LONG).show(); } else { Toast.makeText(getApplicationContext(), "Video uploaded successfully", Toast.LENGTH_SHORT).show(); } } } catch (Exception e) { Toast.makeText(getApplicationContext(), e.getMessage(), Toast.LENGTH_LONG).show(); Log.e(e.getClass().getName(), e.getMessage(), e); } }

我需要知道在哪里可以得到多少字节已经上传。 File.length是总大小。

PD:对不起,我的英语是有规律

--------------解决方案-------------

检查我的答案在这里,我想这回答你的问题:但更新图像的文件路径,你要上载视频

http://stackoverflow.com/questions/15572747/progressbar-in-asynctask-is-not-showing-on-upload

您是否尝试过延长FileBody? 想必POST将任一呼叫getInputStream()writeTo()以便实际的文件数据发送到服务器。 你可以扩展以下任一(包括返回的InputStream中getInputStream()并跟踪有多少数据被发送。

感谢到cyngus的想法,我已经解决了这个问题。 我已经添加了一个代码,用于跟踪上传字节:

监听器上传按钮:

btnSubir.setOnClickListener(new OnClickListener() {

@Override
public void onClick(View v) {
//pd = ProgressDialog.show(VideoAndroidActivity.this, "", "Subiendo Video", true, false);

pd = new ProgressDialog(VideoAndroidActivity.this);
pd.setMessage("Uploading Video");
pd.setIndeterminate(false);
pd.setMax(100);
pd.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);
pd.show();
//Thread thread=new Thread(new threadUploadVideo());
//thread.start();
new UploadVideo().execute();
}
});

AsyncTask的用于运行上传:

class UploadVideo extends AsyncTask<Void,Integer,String> {
private FileBody fb;

@Override
protected String doInBackground(Void... params) {
// Create a new HttpClient and Post Header
HttpClient httpclient = new DefaultHttpClient();
HttpPost httppost = new HttpPost("http://www.youtouch.cl/videoloader/index.php");
int count;
try {
// Add your data
File input=new File(fileName);

// I created a Filebody Object
fb=new FileBody(input);
MultipartEntity multi=new MultipartEntity(HttpMultipartMode.BROWSER_COMPATIBLE);
multi.addPart("video",fb);

httppost.setEntity(multi);
// Execute HTTP Post Request
HttpResponse response = httpclient.execute(httppost);

//get the InputStream
InputStream is=fb.getInputStream();

//create a buffer
byte data[] = new byte[1024];//1024

//this var updates the progress bar
long total=0;
while((count=is.read(data))!=-1){
total+=count;
publishProgress((int)(total*100/input.length()));
}
is.close();
HttpEntity entity = response.getEntity();

BufferedReader reader = new BufferedReader(
new InputStreamReader(
entity.getContent(), "UTF-8"));
String sResponse = reader.readLine();
return sResponse;

} catch (ClientProtocolException e) {
Log.v("Uri Galeria", e.toString());
e.printStackTrace();

} catch (IOException e) {
Log.v("Uri Galeria", e.toString());
e.printStackTrace();
}
return "error";
}

@Override
protected void onProgressUpdate(Integer... unsued) {
pd.setProgress(unsued[0]);
}

@Override
protected void onPostExecute(String sResponse) {
try {
if (pd.isShowing())
pd.dismiss();

if (sResponse != null) {
Toast.makeText(getApplicationContext(),sResponse,Toast.LENGTH_SHORT).show();
Log.i("Splash", sResponse);
}
} catch (Exception e) {
Toast.makeText(getApplicationContext(),
e.getMessage(),
Toast.LENGTH_LONG).show();
Log.e(e.getClass().getName(), e.getMessage(), e);
}
}

}

进度条负荷有点慢(在起点似乎被冷冻,然后1到100非常快速负载),但工程。

对不起,我的英语是有规律:(。

我用做的是延长org.apache.http.entity.ByteArrayEntity并覆盖类似下面的writeTo功能,而字节输出它会通过,虽然的writeTo(),所以你可以指望电流输出字节:

@Override
public void writeTo(final OutputStream outstream) throws IOException
{
if (outstream == null) {
throw new IllegalArgumentException("Output stream may not be null");
}

InputStream instream = new ByteArrayInputStream(this.content);

try {
byte[] tmp = new byte[512];
int total = (int) this.content.length;
int progress = 0;
int increment = 0;
int l;
int percent;

// read file and write to http output stream
while ((l = instream.read(tmp)) != -1) {
// check progress
progress = progress + l;
percent = Math.round(((float) progress / (float) total) * 100);

// if percent exceeds increment update status notification
// and adjust increment
if (percent > increment) {
increment += 10;
// update percentage here !!
}

// write to output stream
outstream.write(tmp, 0, l);
}

// flush output stream
outstream.flush();
} finally {
// close input stream
instream.close();
}
}

分类:安卓 时间:2015-03-16 人气:2
分享到:

相关文章

Copyright (C) 55228885.com, All Rights Reserved.

55228885 版权所有 京ICP备15002868号

processed in 0.604 (s). 10 q(s)