progressdialog bar get freeze

核能气质少年 提交于 2019-12-12 04:59:45

问题


im uploading files and im trying to use progressbar while its uploading

frist of all i start the upload with this code:

@Override
public void onClick(View v) {
    if(v== ivAttachment){

        //on attachment icon click
        showFileChooser();
    }
    if(v== bUpload){

        //on upload button Click
        if(selectedFilePath != null){
            dialog = new ProgressDialog(upload.this);
            dialog.setMax(100);
            dialog.setMessage("Subiendo Archivo...");
            dialog.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);
            dialog.setProgress(0);
            dialog.show();

            //dialog.show(upload.this,"","Subiendo Archivo...",true);

            new Thread(new Runnable() {
                @Override
                public void run() {
                    //creating new thread to handle Http Operations
                    uploadFile(selectedFilePath);
                }
            }).start();

        }else{
            Toast.makeText(upload.this,"Escoge un archivo",Toast.LENGTH_SHORT).show();
        }

    }
}

then uploadFile(selectedFilePath); starts here is part of my code:

File sourceFile = new File(selectedFilePath);
        int totalSize = (int)sourceFile.length();


        HttpURLConnection connection;
        DataOutputStream dataOutputStream;
        String lineEnd = "\r\n";
        String twoHyphens = "--";
        String boundary = "*****";

        int bytesRead,bytesAvailable,bufferSize;
        byte[] buffer;
        int maxBufferSize = 1 * 1024 * 1024;
        File selectedFile = new File(selectedFilePath);


        String[] parts = selectedFilePath.split("/");
        final String fileName = parts[parts.length-1];

        if (!selectedFile.isFile()){
            dialog.dismiss();

            runOnUiThread(new Runnable() {
                @Override
                public void run() {
                    tvFileName.setText("Source File Doesn't Exist: " + selectedFilePath);
                }
            });
            return 0;
        }else{
            try{
                FileInputStream fileInputStream = new FileInputStream(selectedFile);
                URL url = new URL(SERVER_URL);
                connection = (HttpURLConnection) url.openConnection();
                connection.setDoInput(true);//Allow Inputs
                connection.setDoOutput(true);//Allow Outputs
                connection.setUseCaches(false);//Don't use a cached Copy
                connection.setRequestMethod("POST");
                connection.setRequestProperty("Connection", "Keep-Alive");
                connection.setRequestProperty("ENCTYPE", "multipart/form-data");
                connection.setRequestProperty("Content-Type", "multipart/form-data;boundary=" + boundary);
                connection.setRequestProperty("uploaded_file",selectedFilePath);

                //creating new dataoutputstream
                dataOutputStream = new DataOutputStream(connection.getOutputStream());

                //writing bytes to data outputstream
                dataOutputStream.writeBytes(twoHyphens + boundary + lineEnd);
                dataOutputStream.writeBytes("Content-Disposition: form-data; name=\"uploaded_file\";filename=\""
                        + selectedFilePath + "\"" + lineEnd);

                dataOutputStream.writeBytes(lineEnd);

                //returns no. of bytes present in fileInputStream
                bytesAvailable = fileInputStream.available();
                //selecting the buffer size as minimum of available bytes or 1 MB
                bufferSize = Math.min(bytesAvailable,maxBufferSize);
                //setting the buffer as byte array of size of bufferSize
                buffer = new byte[bufferSize];

                //reads bytes from FileInputStream(from 0th index of buffer to buffersize)
                bytesRead = fileInputStream.read(buffer,0,bufferSize);


                int totalBytesWritten = 0;
                Handler handler = new Handler(Looper.getMainLooper());

                        //loop repeats till bytesRead = -1, i.e., no bytes are left to read
                        while (bytesRead > 0) {

                            //write the bytes read from inputstream
                            dataOutputStream.write(buffer, 0, bufferSize);
                            bytesAvailable = fileInputStream.available();
                            bufferSize = Math.min(bytesAvailable, maxBufferSize);
                            bytesRead = fileInputStream.read(buffer, 0, bufferSize);

                                totalBytesWritten += bytesRead;
                            handler.post(new ProgressUpdater(totalBytesWritten, totalSize));

                        }

                dataOutputStream.writeBytes(lineEnd);
                dataOutputStream.writeBytes(twoHyphens + boundary + twoHyphens + lineEnd);

then out of the class i have this:

private class ProgressUpdater implements Runnable {
        private long mUploaded;
        private long mTotal;
        public ProgressUpdater(long uploaded, long total) {
            mUploaded = uploaded;
            mTotal = total;
        }

        @Override
        public void run() {
            onProgressUpdate((int)(100 * mUploaded / mTotal));
        }
    }


    public void onProgressUpdate(int percentage ) {
        // set current progress
        dialog.setProgress(percentage);
    }

so far i think its working but it freezes on some number like 14/100 until the upload finishes


回答1:


Here progress Bar is freezing in between because you are processing heavy task on the UI thread and in Android you should not process the heavy tasks on UI thread.Instead of this you can use the AsyncTask for this purpose.

From the Async task documentation:

When an asynchronous task is executed, the task goes through 4 steps:

1. onPreExecute()

2. doInBackground(Params...)

3. onProgressUpdate(Progress...)

4. onPostExecute(Result)

You can read Progress Dialog from this as well.



来源:https://stackoverflow.com/questions/46559312/progressdialog-bar-get-freeze

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!