Search code examples
androidprogress-bardataoutputstream

Progress bar implementation with write method of dataoutputstream


Is it possible to incorporate a horizontal progress bar in the following code? I was thinking os AsyncTask but then I realized, I can't pass an integer value to ProgressUpdate() method inside doInBackground(). Please help!

public void sendFileDOS() throws FileNotFoundException {
    runOnUiThread( new Runnable() {
          @Override
          public void run() {
              registerLog("Sending. . . Please wait. . .");
          }
        });
    final long startTime = System.currentTimeMillis();
    final File myFile= new File(filePath); //sdcard/DCIM.JPG
    byte[] mybytearray = new byte[(int) myFile.length()];
    FileInputStream fis = new FileInputStream(myFile);  
    BufferedInputStream bis = new BufferedInputStream(fis);
    DataInputStream dis = new DataInputStream(bis);
    try {
        dis.readFully(mybytearray, 0, mybytearray.length);
        OutputStream os = socket.getOutputStream();
        //Sending file name and file size to the server  
        DataOutputStream dos = new DataOutputStream(os);     
        dos.writeUTF(myFile.getName());     
        dos.writeLong(mybytearray.length);     
        dos.write(mybytearray, 0, mybytearray.length);     
        dos.flush();

    } catch (IOException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
    runOnUiThread( new Runnable() {
          @Override
          public void run() {
              long estimatedTime = (System.currentTimeMillis() - startTime)/1000;
              registerLog("File successfully sent");
              registerLog("File size: "+myFile.length()/1000+" KBytes");
              registerLog("Elapsed time: "+estimatedTime+" sec. (approx)");
              registerLog("Server stopped. Please restart for another session.");
              final Button startServerButton=(Button)findViewById(R.id.button1);
              startServerButton.setText("Restart file server");
          }
        });
}

Solution

  • You can use AsyncTask that gets a progress bar like that:

    public abstract class BaseTask extends AsyncTask<String, Integer, String> 
    {   
        private ProgressBar    m_progressBar;
    
        protected BaseTask(ProgressBar p)
        {
            m_progressBar = p;
        }
    
        @Override
        protected void onPreExecute()
        {   
            if (m_progressBar != null)
            {
                m_progressBar.setProgress(0);
            }
        }
    
        @Override
        protected void onPostExecute(String result)
        {   
            if (m_progressBar != null)
                m_progressBar.setVisibility(ProgressBar.GONE);
        }
    
        public void OnProgress(int prog)
        {
            if (m_progressBar != null)
            {
                m_progressBar.setProgress(prog);
            }
        }
    }
    

    To add a progress bar in your xml:

    <ProgressBar
     android:id="@+id/progressBar"
     style="?android:attr/progressBarStyleHorizontal"
     android:layout_width="match_parent"
     android:layout_height="wrap_content"
     android:layout_margin="10dp" />
    

    To initialize the progress bar in your code:

    ProgressBar p = (ProgressBar)findViewById(R.id.progressBar);
    p.setVisibility(ProgressBar.VISIBLE);
    p.setMax(100);