Search code examples
androidrestbufferedreaderprogressoutputstream

Android show the percentage progress of RESTful API


I am trying to call an Restful api using following code. Now I want to show the progress(% of download). Is it at all possible? If, what change in code is needed for that?

    BufferedReader reader=null;
    try{
         URL mUrl = new URL("http://dev.amazaws.com/formservice/rest/v1/registrationreports/registrationsbyproduct/132866/");

         URLConnection conn = url.openConnection();
         conn.setDoOutput(true);
         OutputStreamWriter writer = new OutputStreamWriter(conn.getOutputStream());
         writer.write( data );
         writer.flush();
         reader = new BufferedReader(new InputStreamReader(conn.getInputStream()));
         StringBuilder sb = new StringBuilder();
         String line = null;

         while((line = reader.readLine()) != null)
         {
                    sb.append(line);
         }

         String res = sb.toString();
 }catch(Exception ex){

 }finally{
     try{
       reader.close();
     }catch(Exception ex) {}
}

Solution

  • Try this code, i have implemented this code in one of my application! You can get the idea how to show the percentage! and well This code actually download the JSON from server and saves it on mobile device.

    public class LoginActivity extends Activity {
    private ProgressDialog prgDialog;
    
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.login_layout);
    }
    
    //  Button Click function, on which you want to make restApi call
    public void buttonClicked(View view){
        new PrefetchData().execute();
    }
     private class PrefetchData extends AsyncTask<Void, Integer, Void> {
    
        @Override
        protected void onPreExecute() {
            super.onPreExecute();
            // before making http calls
            prgDialog = new ProgressDialog(LoginActivity.this);
            prgDialog.setMessage("Downloading Data. Please wait...");
            prgDialog.setIndeterminate(false);
            prgDialog.setMax(100);
            prgDialog.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);
            prgDialog.setCancelable(false);
            prgDialog.show();
        }
      @Override
        protected Void doInBackground(Void... arg0) {
    
            InputStream input = null;
            OutputStream output = null;
            HttpURLConnection connection = null;
            try {
                URL url = new URL("http://xyz/testJSON");
                connection = (HttpURLConnection) url.openConnection();
                connection.connect();
    
                // expect HTTP 200 OK, so we don't mistakenly save error report
                // instead of the file
                if (connection.getResponseCode() != HttpURLConnection.HTTP_OK) {
                 //  Show ERROR
                }
    
                int fileLength = connection.getContentLength();
    
    
                input = connection.getInputStream();
    
    
                String extPath = Environment.getExternalStorageDirectory() + "/"        + FILE_PATH;
                //     Environment.
                File file = new File(extPath);
                if(!file.exists()){
                    file.createNewFile();
                }
                output = new FileOutputStream(extPath);
    
    
                byte data[] = new byte[4096];
                long total = 0;
                int count;
                while ((count = input.read(data)) != -1) {
                    total += count;
                    if (fileLength > 0){
                    // only if total length is known
                    // publishing the progress....
                        publishProgress((int) (total * 100 / fileLength));
                    }
    
                    output.write(data, 0, count);
                }
            } catch (Exception e) {
                e.printStackTrace();
            } finally {
                try {
                    if (output != null)
                        output.close();
                    if (input != null)
                        input.close();
                } catch (IOException ignored) {
                }
    
                if (connection != null)
                    connection.disconnect();
            }
            return null;
        }
    
    
        @Override
        protected void onPostExecute(Void result) {
            super.onPostExecute(result);
            // After completing http call
            // will close this activity and lauch main activity
            Intent i = new Intent(LoginActivity.this, MainActivity.class);
            startActivity(i);
    
            // close this activity
            finish();
        }
    
        //Update the progress
        @Override
        protected void onProgressUpdate(Integer... values)
        {
            prgDialog.setProgress(values[0]);
        }
    }