Matt
Matt

Reputation: 3912

Show splash screen until app is done loading

My app loads a lot of stuff on startup and after testing it delays too long at the beginning to not have a splash screen. So, I want to display a splash screen until my app is done loading. I do NOT want to display a screen with a timer for X seconds. I found an example here:

Android SplashScreen

I tried implementing the code in the SO topic above but I just don't understand the code. After integrating it in my code I come up with one error that I commented into the code below. But I don't understand a lot of the code and I have commented in the code below the parts I am confused by.

public class MainMenu extends Activity {

    private ProgressDialog pd = null;
    private Object data = null;  //What is this?

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        requestWindowFeature(Window.FEATURE_NO_TITLE);
        setContentView(R.layout.mainmenu);

        // show the ProgressDialog on this thread
        this.pd = ProgressDialog.show(this, "Working...", "Downloading data...", true, false);

        // start a new thread that will download all the data
        new DownloadTask().execute("Any parameters to download.");  //What is DownloadTask()?
    }

    private class DownloadTask extends AsyncTask<String, Void, Object> {

        protected Object doInBackground(String... args) {  //Are these parameters correct?
            return "replace this with your object";  //What is this?
        }

        protected void onPostExecute(Object results) {
            // pass the resulting data to the main activity
            MainMenu.this.data = result;  //Error:  "result cannot be resolved to a variable"

            if(MainMenu.this.pd != null) {
                MainMenu.this.pd.dismiss();
            }
        }
    }
}

Upvotes: 1

Views: 2005

Answers (2)

Pragnani
Pragnani

Reputation: 20155

Show ProgressDialog in onPreexecute and dismiss it in onPostExcute methods

something like this

private class DownloadTask extends AsyncTask<String, Void, Object> {

           @Override
protected void onPreExecute() {
  mProgressDialog = new ProgressDialog(activity);
    mProgressDialog =ProgressDialog.show(activity, "", "Please Wait",true,false);
    super.onPreExecute();
}

        protected Object doInBackground(String... args) {  //Are these parameters correct?
            return "replace this with your object";  //What is this?
        }

        protected void onPostExecute(Object results) {
            // pass the resulting data to the main activity
            MainMenu.this.data = results;  //it should be results 
if (mProgressDialog != null || mProgressDialog.isShowing()){
         mProgressDialog.dismiss();
 }
            if(MainMenu.this.pd != null) {
                MainMenu.this.pd.dismiss();
            }
        }

Upvotes: 2

karllindmark
karllindmark

Reputation: 6071

Let's start with the error:

MainMenu.this.data = result;

Notice the typo? It should be result*s*:

MainMenu.this.data = results;

Addressing the rest of your questions below:

private class DownloadTask extends AsyncTask<String, Void, Object>

The declaration is for an inline class called DownloadTask, and it states that you'll be taking Strings (via String...) as parameters to your doInBackground(String... params).

The second parameter (Void in your case) indicates the datatype used to "publish" the progress via publishProgress(DATATYPE)/onProgressUpdate(DATATYPE... progress). This method is suitable for notifying the user of changes, for example when you've finished downloading a file but still have a few to go.

The last parameter (Object), indicates what type of data you'll be passing on to onPostExecute(DATATYPE), in this example Object. This could either be to update a ListAdapter somewhere, or trigger any other UI change based on the outcome of the actions done in doInBackground.

Upvotes: 4

Related Questions