首页 > 解决方案 > 在文件上传期间显示带有百分比的水平进度条的最佳方式?

问题描述

我是 android 新手,正在尝试一个简单的图像上传应用程序。我能够使用 asynctask 完成所有上传,并且工作正常。我目前正在显示简单的进度对话框,一切都很好,但我想用进度条显示百分比。我正在使用 asynctask 进行上传,但不知道显示百分比。任何人都可以帮我做吗?

我的代码如下

public void UploadImageToServer(){

    FixBitmap.compress(Bitmap.CompressFormat.JPEG, 100, byteArrayOutputStream);

    byteArray = byteArrayOutputStream.toByteArray();

    ConvertImage = Base64.encodeToString(byteArray, Base64.DEFAULT);

    class AsyncTaskUploadClass extends AsyncTask<Void,Void,String> {

        @Override
        protected void onPreExecute() {

            super.onPreExecute();


            progressDialog = ProgressDialog.show(MainActivity.this,"Image is Uploading","Please Wait",false,false);
        }

        @Override
        protected void onPostExecute(String string1) {

            super.onPostExecute(string1);

            progressDialog.dismiss();

            Toast.makeText(MainActivity.this,string1,Toast.LENGTH_LONG).show();

        }

        @Override
        protected String doInBackground(Void... params) {

            ImageProcessClass imageProcessClass = new ImageProcessClass();

            HashMap<String,String> HashMapParams = new HashMap<String,String>();

            HashMapParams.put(ImageTag, GetImageNameFromEditText);

            HashMapParams.put(ImageName, ConvertImage);

            String FinalData = imageProcessClass.ImageHttpRequest(URL, HashMapParams);

            return FinalData;
        }
    }
    AsyncTaskUploadClass AsyncTaskUploadClassOBJ = new AsyncTaskUploadClass();
    AsyncTaskUploadClassOBJ.execute();
}

public class ImageProcessClass{

    public String ImageHttpRequest(String requestURL,HashMap<String, String> PData) {

        StringBuilder stringBuilder = new StringBuilder();

        try {
            url = new URL(requestURL);

            httpURLConnection = (HttpURLConnection) url.openConnection();

            httpURLConnection.setReadTimeout(20000);

            httpURLConnection.setConnectTimeout(20000);

            httpURLConnection.setRequestMethod("POST");

            httpURLConnection.setDoInput(true);

            httpURLConnection.setDoOutput(true);

            outputStream = httpURLConnection.getOutputStream();

            bufferedWriter = new BufferedWriter(

                    new OutputStreamWriter(outputStream, "UTF-8"));

            bufferedWriter.write(bufferedWriterDataFN(PData));

            bufferedWriter.flush();

            bufferedWriter.close();

            outputStream.close();

            RC = httpURLConnection.getResponseCode();

            if (RC == HttpsURLConnection.HTTP_OK) {

                bufferedReader = new BufferedReader(new InputStreamReader(httpURLConnection.getInputStream()));

                stringBuilder = new StringBuilder();

                String RC2;

                while ((RC2 = bufferedReader.readLine()) != null){

                    stringBuilder.append(RC2);
                }
            }

        } catch (Exception e) {
            e.printStackTrace();
        }
        return stringBuilder.toString();
    }

    private String bufferedWriterDataFN(HashMap<String, String> HashMapParams) throws UnsupportedEncodingException {

        stringBuilder = new StringBuilder();

        for (Map.Entry<String, String> KEY : HashMapParams.entrySet()) {
            if (check)
                check = false;
            else
                stringBuilder.append("&");

            stringBuilder.append(URLEncoder.encode(KEY.getKey(), "UTF-8"));

            stringBuilder.append("=");

            stringBuilder.append(URLEncoder.encode(KEY.getValue(), "UTF-8"));
        }

        return stringBuilder.toString();
    }

}

谢谢!

标签: javaandroidprogress-bar

解决方案


有一个用于进度更新的内置机制AsyncTask。访问它所需要做的就是onProgressUpdateAsyncTask. 它以可用于更新 UI 的参数的形式获取进度。考虑到AsyncTask在后台线程中运行并且您需要使用进度更新 UI 线程,您可以publishProgress从您的调用doInBackgroundwhich 使进度更新在 UI 线程上运行。

 protected void onProgressUpdate(String... progress) {
    progressDialog.setProgress(Integer.parseInt(progress[0]));
 }

推荐阅读