Haldamir
Haldamir

Reputation: 115

Show progress bar between 2 activities

I have 2 activities, 1 called MainActivity, and the other called Circle. I want to have a progress bar loading screen come up when I click a button on the MainActivity to launch a second one. Here is the code that I have at the moment but it just causes the app to crash.

public class LoadingScreenActivity extends Activity 
{
//A ProgressDialog object
private ProgressDialog progressDialog;

/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) 
{
    super.onCreate(savedInstanceState);

    //Initialize a LoadViewTask object and call the execute() method
    new LoadViewTask().execute();       

}

//To use the AsyncTask, it must be subclassed
private class LoadViewTask extends AsyncTask<Void, Integer, Void>
{
    //Before running code in the separate thread
    @Override
    protected void onPreExecute() 
    {
        //Create a new progress dialog
        progressDialog = new ProgressDialog(LoadingScreenActivity.this);
        //Set the progress dialog to display a horizontal progress bar 
        progressDialog.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);
        //Set the dialog title to 'Loading...'
        progressDialog.setTitle("Loading...");
        //Set the dialog message to 'Loading application View, please wait...'
        progressDialog.setMessage("Loading application View, please wait...");
        //This dialog can't be canceled by pressing the back key
        progressDialog.setCancelable(false);
        //This dialog isn't indeterminate
        progressDialog.setIndeterminate(false);
        //The maximum number of items is 100
        progressDialog.setMax(100);
        //Set the current progress to zero
        progressDialog.setProgress(0);
        //Display the progress dialog
        progressDialog.show();
    }

    //The code to be executed in a background thread.
    @Override
    protected Void doInBackground(Void... params) 
    {
        /* This is just a code that delays the thread execution 4 times, 
         * during 850 milliseconds and updates the current progress. This 
         * is where the code that is going to be executed on a background
         * thread must be placed. 
         */
        try 
        {
            //Get the current thread's token
            synchronized (this) 
            {
                //Initialize an integer (that will act as a counter) to zero
                int counter = 0;
                //While the counter is smaller than four
                while(counter <= 4)
                {
                    //Wait 850 milliseconds
                    this.wait(850);
                    //Increment the counter 
                    counter++;
                    //Set the current progress. 
                    //This value is going to be passed to the onProgressUpdate() method.
                    publishProgress(counter*25);
                }
            }
        } 
        catch (InterruptedException e) 
        {
            e.printStackTrace();
        }
        return null;
    }

    //Update the progress
    @Override
    protected void onProgressUpdate(Integer... values) 
    {
        //set the current progress of the progress dialog
        progressDialog.setProgress(values[0]);
    }

    //after executing the code in the thread
    @Override
    protected void onPostExecute(Void result) 
    {
        //close the progress dialog
        progressDialog.dismiss();
        //initialize the View
        setContentView(R.layout.content_circle);
    }   
}

}

Upvotes: 3

Views: 2357

Answers (2)

Kenan Begić
Kenan Begić

Reputation: 1228

You can add some default view like progressbar in second activity XML that is visible by default. When you load data or whatever you do set it to view.GONE. Nice library like this :

https://github.com/81813780/AVLoadingIndicatorView

In your second_activity.xml use :

 <com.wang.avi.AVLoadingIndicatorView
        android:layout_gravity="center"
        android:id="@+id/avloadingIndicatorView"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:visibility="visible"
        app:indicatorName="BallPulse"
        app:indicatorColor="@color/myPrimaryColor"/>

Then in your activity onCreate() method :

  public void onCreate(Bundle savedInstanceState) {            
            super.onCreate(savedInstanceState);
loader= (AVLoadingIndicatorView) findViewById(R.id.avloadingIndicatorView);
    }

And finally when you finish the loading just use :

 loader.setVisibility(View.GONE);

Upvotes: 2

Pavan Bilagi
Pavan Bilagi

Reputation: 1617

First create a common Class Utility for ProgressDialog to reuse the code

public class Utility {
    public static ProgressDialog getProgressDialog(Context context) {
        ProgressDialog progressDialog = new ProgressDialog(context,
                R.style.TransparentDialog);
        progressDialog.setCancelable(false);
        progressDialog
                .setProgressStyle(android.R.style.Widget_ProgressBar_Small);
        progressDialog.setProgress(0);
        return progressDialog;
    }

}

Then Use the Above class in your activity or fragment. But you have to use to Intent for go to next activity. you can't directly set the next activity layout

public class LoadingScreenActivity extends Activity 
{
//A ProgressDialog object
protected ProgressDialog dialog;

/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) 
{
    super.onCreate(savedInstanceState);

    //Initialize a LoadViewTask object and call the execute() method
    new LoadViewTask().execute();       

}

//To use the AsyncTask, it must be subclassed
private class LoadViewTask extends AsyncTask<Void, Integer, Void>
{
    //Before running code in the separate thread
    @Override
    protected void onPreExecute() 
    {
            super.onPreExecute();
            dialog = Utility.getProgressDialog(context);
            dialog.setCanceledOnTouchOutside(false);
            dialog.setCancelable(false);
            if (dialog != null) {
                dialog.show();
            }

    }

    //The code to be executed in a background thread.
    @Override
    protected Void doInBackground(Void... params) 
    {
        /* This is just a code that delays the thread execution 4 times, 
         * during 850 milliseconds and updates the current progress. This 
         * is where the code that is going to be executed on a background
         * thread must be placed. 
         */
        try 
        {
            //Get the current thread's token
            synchronized (this) 
            {
                //Initialize an integer (that will act as a counter) to zero
                int counter = 0;
                //While the counter is smaller than four
                while(counter <= 4)
                {
                    //Wait 850 milliseconds
                    this.wait(850);
                    //Increment the counter 
                    counter++;
                    //Set the current progress. 
                    //This value is going to be passed to the onProgressUpdate() method.
                    publishProgress(counter*25);
                }
            }
        } 
        catch (InterruptedException e) 
        {
            e.printStackTrace();
        }
        return null;
    }



    //after executing the code in the thread
    @Override
    protected void onPostExecute(Void result) 
    {
        //close the progress dialog
         dialog.dismiss();
        // use intent here to go next activity
        Intent i = new Intent(this,SecondActivity.class);
        startIntent(i);

    }   
}

Upvotes: 1

Related Questions