James Dudley
James Dudley

Reputation: 957

Delaying a Task and showing progress bar

I seem to be going round in circles. I have some code that even on a Galaxy S3 takes a few seconds to run. Drags data from database. I want to add a progress bar popup (spinning circle) around this to give the user that the app is doing something. I have tried Asyntasks elsewhere in app and work fine but for this type the main UI is not waiting for the Asyntask to finish before moving on and so the new activity that is called does not have all the data it needs and crashes.

Is AsyncTask the best way round this or is there an easier way to Puase the main Activity, show a progress bar and then move on once the long deley has been completed.

Thanks for time

UPDATE

public class UpdateDetailsAsyncTask extends AsyncTask<Void, Void, Boolean> {   

    private Context context;
    private TaskCallback callback;

    private ArrayList<Object> object;

    private ProgressDialog progress; 

    public UpdateDetailsAsyncTask (
            Context pContext, 
            ArrayList<Object> pObject,
            TaskCallback pCallback) {

        context = pContext;
        callback = pCallback;
        object = pObject;

    }

    @Override
    protected void onPreExecute() {

        Log.i("AsyncTask", "onPreExecuted");

        progress = new ProgressDialog(context);
        progress.setMessage(context.getResources().getString(R.string.loading));
        progress.show();

    }

    @Override
    protected Boolean doInBackground(Void... params) {

        Log.i("Archery", "AsyncTask Excuted");
        Log.i("Archery Scorepad", "Building Continue Round Details");

        // Save Data to Database

        return true;

    }


    protected void onPostExecute(Boolean result) {

        Log.i("AsyncTask", "onPostExuted");

        progress.dismiss();

        callback.startNewActivity();

    }

}

Task is called from main Activity

new UpdateDetailsAsyncTask(this, ArrayListOfObjects, this).exute();

UPDATE 2

..

UPDATE 3

The Code that does some work calls an a method within a Util Class which in calls a database class. I have log messages showing for all the rows of data I am saving to the database. It starts correctly and runs through it but the onPostExecute() appears to be called before the database method has completed.

Is my issue that I have nested classes within the activity and the task appears to have completed when the class below it has not?

Thanks

Upvotes: 1

Views: 763

Answers (2)

Jeff Lee
Jeff Lee

Reputation: 781

Yes!

Here is a simple code of AsuncTask

private class LoadImageAction extends AsyncTask<String, String, String>{

    private Course course;
    private ProgressBar pb;

    public LoadImageAction(Course course, ProgressBar pb){
        this.course = course;
        this.pb = pb;
    }

    @Override
    protected void onPreExecute(){

    }

    @Override
    protected String doInBackground(String... arg0) {
        // TODO Auto-generated method stub

        return null;
    }

    @Override 
    protected void onProgressUpdate(String... string){


    }

    @Override
    protected void onPostExecute(String result){

    }
}

You can run the action by

new LoadImageAction().execute();

Upvotes: 0

mromer
mromer

Reputation: 1897

You must change to the next activity in onPostExecute from Asyntask

Upvotes: 2

Related Questions