Android-在将图像发送到服务器时在Async任务中显示ProgressBar

时间:2014-02-21 18:04:47

标签: android android-asynctask android-progressbar

我是android新手。我正在尝试在向服务器发送照片时在aysnc任务中显示进度条,我想创建与文件一样多的进度条,这些进度条将根据发送到服务器的字节数百分比来更改状态。我进行了搜索,发现了一些与此相关的问题,但无法修改我的代码,问题是按下按钮后进度条没有显示。

这是我的代码

public  class HttpUploader extends AsyncTask<String, Void, String> {
    /*----------------------
    i followed some questions and here i have tried something but caused me an error

   private ProgressDialog dialog;
     private Context context;

    @Override
    protected void onPreExecute() {
        dialog = new ProgressDialog(context);
        dialog.setMessage("Uploading...");
        dialog.setIndeterminate(false);
        dialog.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);
        dialog.setProgress(0);
        dialog.show();
    }

    protected void onPostExecute(final Boolean success) {
        if (dialog.isShowing()) {
            dialog.dismiss();
        }
    }-------------------------*/ 
    protected String doInBackground(String... path) {

        String outPut = null;

        for (String sdPath:path) {

            Bitmap bitmapOrg = BitmapFactory.decodeFile(sdPath);
            ByteArrayOutputStream bao = new ByteArrayOutputStream();

            //Resize the image
            double width = bitmapOrg.getWidth();
            double height = bitmapOrg.getHeight();
            double ratio = 400/width;
            int newheight = (int)(ratio*height);

           // System.out.println("———-width" + width);
            //System.out.println("———-height" + height);

            bitmapOrg = Bitmap.createScaledBitmap(bitmapOrg, 400, newheight, true);

            //Here you can define .PNG as well
            bitmapOrg.compress(Bitmap.CompressFormat.JPEG, 95, bao);
            byte[] ba = bao.toByteArray();
            String ba1 = Base64.encodeToString(ba, 0);

            //System.out.println("uploading image now ——–" + ba1);

            ArrayList<NameValuePair> nameValuePairs = new ArrayList<NameValuePair>();
            nameValuePairs.add(new BasicNameValuePair("image", ba1));

            try {
                HttpClient httpclient = new DefaultHttpClient();
                HttpPost httppost = new HttpPost("http://imageuplaod");
                httppost.setEntity(new UrlEncodedFormEntity(nameValuePairs));

                HttpResponse response = httpclient.execute(httppost);
                HttpEntity entity = response.getEntity();                

                // print responce
                outPut = EntityUtils.toString(entity);
                Log.i("GET RESPONSE—-", outPut);

                //is = entity.getContent();
                Log.e("log_tag ******", "good connection");

                bitmapOrg.recycle();

            } catch (Exception e) {
                Log.e("log_tag ******", "Error in http connection " + e.toString());
            }
        }
        return outPut;
    }


  }

我的MainActivity

 public class MainActivity extends Activity{

    Uri currImageURI;


    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
      Button upload_btn = (Button) this.findViewById(R.id.uploadButton);
        upload_btn.setOnClickListener(new View.OnClickListener() {
            public void onClick(View view) {


                upload();
                }});

    }

    public void upload(){         

                ArrayList<Uri> fileName = getFileList();
                for ( int i = 0 ; i < fileName.size() ; i++ )
                {
                HttpUploader uploader = new HttpUploader();

                try {

                      uploader.execute(getRealPathFromURI(fileName.get(i))).get();
                      Thread.sleep(1000);   
                } catch (InterruptedException e) {
                      e.printStackTrace();
                    } catch (ExecutionException e) {
                      e.printStackTrace();
                    }
                }
                TextView tv_path = (TextView) findViewById(R.id.path);
                tv_path.setText(getRealPathFromURI(currImageURI));
            }



    public String getRealPathFromURI(Uri contentUri) {

        String [] proj={MediaStore.Images.Media.DATA};
        android.database.Cursor cursor = managedQuery( contentUri,
        proj,     // Which columns to return
        null,     // WHERE clause; which rows to return (all rows)
        null,     // WHERE clause selection arguments (none)
        null);     // Order-by clause (ascending by name)
        int column_index = cursor.getColumnIndexOrThrow(MediaStore.Images.Media.DATA);
        cursor.moveToFirst();
        return cursor.getString(column_index);
    }


    private ArrayList<Uri> getFileList()
    {
        ArrayList<Uri> fileList = new ArrayList<Uri>();
        try
        {
            String[] proj = { MediaStore.Images.Media.DATA, MediaStore.Images.Media._ID };
            Cursor actualimagecursor = managedQuery(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, proj,
                    null, null, MediaStore.Images.Media.DEFAULT_SORT_ORDER);

            int actual_image_column_index = actualimagecursor.getColumnIndexOrThrow(MediaStore.Images.Media._ID);

            for ( int i = 0 ; i < actualimagecursor.getCount() ; i++ )
            {
                actualimagecursor.moveToPosition(i);
                String fileName = actualimagecursor.getString(actual_image_column_index);
                fileList.add(( Uri.withAppendedPath( MediaStore.Images.Media.EXTERNAL_CONTENT_URI, fileName )));
                //fileName = ( Uri.withAppendedPath( MediaStore.Images.Media.EXTERNAL_CONTENT_URI, fileName ).toString() );
            }
            return fileList;
        }
        catch ( Exception e )
        {
            return null;
        }
    }

}

4 个答案:

答案 0 :(得分:0)

尝试异步运行asyncTask。不要使用“get()”函数。相反,通过“onPostExecute”回调获得结果。

答案 1 :(得分:0)

进度条包含进度号/百分比/其他:

        pg = new ProgressDialog(this);
        pg.setCancelable(false);
        pg.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);
        pg.setProgress(0);
        pg.setMax(100);
        pg.setMessage("Loading...");
        pg.show();


private class someAsyncClass extends AsyncTask<String, String, Void> {

    @Override
    protected Void doInBackground(String... params) {
            int percent = calchowfaryouare;
            publishProgress("Loading... "+percent+"%");

    }

    @Override
    protected void onProgressUpdate(String... progress) {
        super.onProgressUpdate(progress);
        if (pg != null) {
            pg.setMessage(progress[0]);
            pg.show();
        }
    }

}

编辑:您的问题是,在您的注释代码中,您使用了上下文,但在您的情况下,它将为null。你永远不会为此分配东西。如果您在Activity中调用异步任务,只需使用类似MainActivity.this或getApplication()的内容。

编辑2:

所以我认为HttpUploader在一个单独的文件中是正确的吗? 如果是这样,最简单的方法是将其复制到MainActivity中。 只需在最后一次'}'之前插入即可。 只需将“上下文上下文”更改为“上下文上下文= MainActivity.this”。

您也可以只将一个构造函数插入到该类中,并将HttpUploader嵌套在自己的文件中,但这可能会更复杂。

答案 2 :(得分:0)

@Override
protected void onProgressUpdate(Integer... values) {
  super.onProgressUpdate(values);
  dialog.setProgress(values[0]);
}

在doInBackground中:

publishProgress(someValue);

答案 3 :(得分:0)

使用此代码在aysnc Task的onPreExecute()中显示进度条。

 pDialog = new ProgressDialog(XMPPChatDemoActivity.this);
        pDialog.setMessage("Downloading file. Please wait...");
        pDialog.setIndeterminate(false);
        pDialog.setMax(100);
        pDialog.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);
        pDialog.setCancelable(true);
        pDialog.show();

并在onPostExecute()方法中调用它为pDialog.dissmiss(); 根据你设置ProgressDialog样式和setCancelable()。