how to Copy files from path to path with ProgressBar in java

Tags: ,



i hope you are fine. i have here a code i took it from this site, for copy files from path to path. i want to use a progressBar with it, how do i use the progressBar with the counter?

i used the bellow code, and there’s is no progress in progressBar ! this is the code :

progressbar1 = (ProgressBar) findViewById(R.id.progressbar1);
    progressbar1.setMax((int)100);  

    java.io.File filein  = new java.io.File("/storage/emulated/0/Alarms/test.zip");
    java.io.File fileout = new java.io.File("/storage/emulated/0/testcopied.zip");
    java.io.FileInputStream  fin  = null;
    java.io.FileOutputStream fout = null;
    long length  = filein.length();
    long counter = 0;
    int r = 0;
    byte[] b = new byte[1024];
    try {
            fin  = new java.io.FileInputStream(filein);
            fout = new java.io.FileOutputStream(fileout);
            while( (r = fin.read(b)) != -1) {
                    counter += r;

                    int k = (int)counter;
                    progressbar1.setProgress((int)k);
                    System.out.println( 1.0 * counter / length );
                    fout.write(b, 0, r);

            }
    }
    catch(Exception e){
            System.out.println("foo");
    }

Answer

In Android, for long-running operators such as download files from the network, access database, copying file, you should use a background thread to prevent the app from freeze or even crash.

To update progress bar’s progress, you should do it in UI/main thread by using serveral mechanism such as runOnUiThread(Runnable) from Activity class or post(Runnable) from Handler class.

So your code will be:

public class MainActivity extends AppCompatActivity {

    ProgressBar progressbar1;

    // Use a background thread to copy files
    Thread copyingThread;

    // Use Handler to update progress bar's progress
    Handler mainHandler = new Handler(Looper.getMainLooper());

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        progressbar1 = (ProgressBar) findViewById(R.id.progressbar1);
        progressbar1.setMax(100);
        progressbar1.setProgress(0);

        copyingThread = new Thread(new Runnable() {
            @Override
            public void run() {
                File sourceFile = new java.io.File("/storage/emulated/0/Alarms/test.zip");
                File destFile = new java.io.File("/storage/emulated/0/testcopied.zip");
                FileInputStream fileInputStream;
                FileOutputStream fileOutputStream;
                long length = sourceFile.length();
                int bytesRead;
                int totalBytesRead = 0;
                byte[] buffer = new byte[4 * 1024]; // 4KB buffer
                try {
                    fileInputStream = new FileInputStream(sourceFile);
                    fileOutputStream = new FileOutputStream(destFile);

                    while (!Thread.currentThread().isInterrupted()
                            && (bytesRead = fileInputStream.read(buffer)) != -1) {
                        // Write bytesRead to destination file
                        fileOutputStream.write(buffer, 0, bytesRead);

                        // Calculate the copying percent
                        totalBytesRead += bytesRead;
                        int percent = (int) (totalBytesRead * 100 / length);
                        Log.i("DEBUG", "Copied: " + percent + "%");

                        // Update progress bar's progress in UI/main thread
                        mainHandler.post(new Runnable() {
                            @Override
                            public void run() {
                                progressbar1.setProgress(percent);
                            }
                        });
                    }
                } catch (Exception e) {
                    System.out.println("foo");
                }
            }
        });
        copyingThread.start();
    }

    @Override
    protected void onDestroy() {
        // Release copying thread's resource in case users leaving this activity
        if (copyingThread != null && copyingThread.isAlive()) {
            copyingThread.interrupt();
        }
        super.onDestroy();
    }
}


Source: stackoverflow