Android AsyncTask onProgressUpdate-如何获取上传文件的进度百分比?
我使用异步任务和onProgressUpdate上传图像。它运行得很好,但是我在获取上传文件的百分比时遇到了问题。我如何知道当前上传文件的百分比。 下面是我使用的代码Android AsyncTask onProgressUpdate-如何获取上传文件的进度百分比?,android,android-asynctask,android-progressbar,Android,Android Asynctask,Android Progressbar,我使用异步任务和onProgressUpdate上传图像。它运行得很好,但是我在获取上传文件的百分比时遇到了问题。我如何知道当前上传文件的百分比。 下面是我使用的代码 private class ImageUpload extends AsyncTask<String,Integer,String> { @Override protected void onProgressUpdate(Integer... progress) {
private class ImageUpload extends AsyncTask<String,Integer,String> {
@Override
protected void onProgressUpdate(Integer... progress) {
// TODO Auto-generated method stub
mProgressDialog.setProgress((int) (progress[0]));
}
@Override
protected String doInBackground( String... params ) {
String result = "";
HttpClient httpClient = new DefaultHttpClient();
HttpPost httpPostRequest = new HttpPost( "http://192.168.212.177:8089/services/imageUpload" );
try {
Date todaysdate = new Date();
for ( String imageFile : params ) {
Bitmap bm = BitmapFactory.decodeFile(imageFile);
ByteArrayOutputStream baos = new ByteArrayOutputStream();
bm.compress(Bitmap.CompressFormat.JPEG, 15, baos); //bm is the bitmap object
byte[] b = baos.toByteArray();
String encodedImage = Base64.encodeToString(b, Base64.DEFAULT);
FileBody bin = new FileBody( file );
MultipartEntityBuilder multiPartEntityBuilder = MultipartEntityBuilder.create();
int strIndex = imageFile.lastIndexOf( "/" );
String imageName = imageFile.substring( strIndex + 1 , imageFile.length() );
multiPartEntityBuilder.addPart( "imageFile" , new StringBody(encodedImage , ContentType.TEXT_PLAIN ) );
multiPartEntityBuilder.addPart( "filename" , new StringBody( farmersEnteredNumber + "_" + datemill.getTime() , ContentType.TEXT_PLAIN ) );
multiPartEntityBuilder.addPart( "imageName" , new StringBody( imageName, ContentType.TEXT_PLAIN ) );
long total = 0;
long lenghtOfFile = multiPartEntityBuilder.build().getContentLength();
publishProgress((int)((total*100)/lenghtOfFile));
httpPostRequest.setEntity( multiPartEntityBuilder.build() );
HttpResponse httpResponse = null;
httpResponse = httpClient.execute( httpPostRequest );
InputStream inputStream = null;
inputStream = httpResponse.getEntity().getContent();
if ( inputStream != null )
result = convertInputStreamToString( inputStream );
else
result = "Did not work!";
return result;
}
} catch ( Exception e ) {
return null;
}
return result;
}
@Override
protected void onPreExecute() {
// TODO Auto-generated method stub
super.onPreExecute();
FarmerDetails.this.runOnUiThread( new Runnable() {
public void run() {
mProgressDialog = new ProgressDialog( FarmerDetails.this );
mProgressDialog.setTitle( "Image Uploading" );
mProgressDialog.setMessage( "Uploading Image Please Wait" );
mProgressDialog.setIndeterminate( false );
mProgressDialog.setMax(100);
mProgressDialog.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);
mProgressDialog.setCancelable(true);
mProgressDialog.show();
}
} );
}
@Override
protected void onPostExecute( String result ) {
super.onPostExecute( result );
mProgressDialog.dismiss();
// TODO Auto-generated method stub
}
}
私有类ImageUpload扩展异步任务{
@凌驾
受保护的void onProgressUpdate(整数…进度){
//TODO自动生成的方法存根
setProgress((int)(progress[0]);
}
@凌驾
受保护的字符串doInBackground(字符串…参数){
字符串结果=”;
HttpClient HttpClient=新的DefaultHttpClient();
HttpPost httpPostRequest=新的HttpPost(“http://192.168.212.177:8089/services/imageUpload" );
试一试{
Date todaysdate=新日期();
用于(字符串图像文件:参数){
位图bm=BitmapFactory.decodeFile(图像文件);
ByteArrayOutputStream bas=新的ByteArrayOutputStream();
bm.compress(Bitmap.CompressFormat.JPEG,15,baos);//bm是位图对象
字节[]b=baos.toByteArray();
字符串encodedImage=Base64.encodeToString(b,Base64.DEFAULT);
FileBody bin=新的FileBody(文件);
MultipartEntityBuilder MultipartEntityBuilder=MultipartEntityBuilder.create();
int strIndex=imageFile.lastIndexOf(“/”);
字符串imageName=imageFile.substring(strIndex+1,imageFile.length());
multiPartEntityBuilder.addPart(“imageFile”,新的StringBody(encodedImage,ContentType.TEXT_PLAIN));
multiPartEntityBuilder.addPart(“文件名”,新的StringBody(farmersEnteredNumber+“\u”+datemill.getTime(),ContentType.TEXT\u PLAIN));
addPart(“imageName”,新的StringBody(imageName,ContentType.TEXT_PLAIN));
长总计=0;
long lenghtOfFile=multiPartEntityBuilder.build().getContentLength();
出版进度((整数)((总计*100)/长度办公室);
setEntity(multiPartEntityBuilder.build());
HttpResponse HttpResponse=null;
httpResponse=httpClient.execute(httpPostRequest);
InputStream InputStream=null;
inputStream=httpResponse.getEntity().getContent();
如果(inputStream!=null)
结果=convertInputStreamToString(inputStream);
其他的
结果=“不起作用!”;
返回结果;
}
}捕获(例外e){
返回null;
}
返回结果;
}
@凌驾
受保护的void onPreExecute(){
//TODO自动生成的方法存根
super.onPreExecute();
FarmerDetails.this.rununuithread(新的Runnable(){
公开募捐{
mProgressDialog=新建进度对话框(FarmerDetails.this);
mProgressDialog.setTitle(“图像上传”);
设置消息(“上传图像请稍候”);
mProgressDialog.setUndeterminate(false);
mProgressDialog.setMax(100);
mProgressDialog.setProgressStyle(ProgressDialog.STYLE_水平);
mProgressDialog.setCancelable(真);
mProgressDialog.show();
}
} );
}
@凌驾
受保护的void onPostExecute(字符串结果){
super.onPostExecute(结果);
mProgressDialog.disclose();
//TODO自动生成的方法存根
}
}
最简单的方法是使用count_of_of_uploaded_files\count_of_of_all_files作为百分比。异步任务的onPreExecute()方法不需要使用runOnUiThread()。OnPreExecute被设置为在UI线程上调用我正在尝试只上载一个图像…也许这个链接可以帮助您将HttpEntity子类化以计算传输的字节数。另外,您从哪个线程启动此AsyncTask?谢谢,请看一看:)我从主线程启动了AsyncTask