Лучший способ показать горизонтальный индикатор выполнения с процентами во время загрузки файла? - PullRequest
0 голосов
/ 09 марта 2020

Я новичок в 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();
    }

}

Спасибо!

1 Ответ

0 голосов
/ 09 марта 2020

В AsyncTask есть встроенный механизм для обновления прогресса. Все, что вам нужно сделать, чтобы получить к нему доступ, это переопределить onProgressUpdate внутри AsyncTask. Он получает прогресс в качестве параметра, который вы можете использовать для обновления пользовательского интерфейса. Учитывая, что AsyncTask работает в фоновом потоке, и вам необходимо обновить поток пользовательского интерфейса с прогрессом, вы можете вызвать publishProgress из вашего doInBackground, который заставит обновление прогресса работать в потоке пользовательского интерфейса.

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