Android AsyncTask 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) {

我使用异步任务和onProgressUpdate上传图像。它运行得很好,但是我在获取上传文件的百分比时遇到了问题。我如何知道当前上传文件的百分比。 下面是我使用的代码

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