External AsyncTask class with ProgressDialog [Update: and returning back?]

11,335

Solution 1

You were creating the ProgressDialog with a null context. The following code worked for me.

public class AsyncClass extends AsyncTask<Void, String, Void> {
    private Context context;
    ProgressDialog dialog;

        public AsyncClass(Context cxt) {
            context = cxt;
            dialog = new ProgressDialog(context);
        }

        @Override
        protected void onPreExecute() {
            dialog.setTitle("Please wait");
            dialog.show();
        }

        @Override
        protected Void doInBackground(Void... unused) {
            SystemClock.sleep(2000);
            return (null);
        }

        @Override
        protected void onPostExecute(Void unused) {
            dialog.dismiss();
        }
    }

Solution 2

ok this is what I did as i was using fragments. This is how you call the AsyncTask inside a fragment:

String result=new AsyncClass(getActivity()).execute();

and this is how my AsyncTask outer class looks like:

public class AsyncClass extends AsyncTask<Void, Void, String> {

    ProgressDialog pdialog;

    public AsyncClass(Context context) {
        pdialog = new ProgressDialog(context);
    }

    @Override
    protected void onPreExecute() {
        pdialog.setIndeterminate(true);
        pdialog.setCancelable(false);
        pdialog.setTitle("Loading Feed..");
        pdialog.setMessage("Please wait.");pdialog.show();
    }

    @Override
    protected String doInBackground(Void... params) {
        String result=null;
        //do your task here and generate result String
        return result;
    }

    @Override
    protected void onPostExecute(String result) {
        if(pdialog.isShowing())
             pdialog.dismiss();
    }
}

@SSZero thanks great answer, helped a lot.

Solution 3

I would like to answer that follow up question i.e.

I have a follow up question: Using the above code, is it possible to return a value from the onPostExecute method back to the main class, somehow? (Sorry about beeing noobish) I have tried something like this:

String result = new AsyncClass(this).execute();

I did this in my code it worked.

AsyncClass ac=new AsyncClass();
                    
ac.execute("");

String rslt=ac.get();

Call this code wherever you want to.

public class AsynchClass extends AsyncTask <String,Integer,String>
{

    public String result=null;


    @Override
    protected void onPreExecute() {
    // TODO Auto-generated method stub  
     
    }

    protected String doInBackground(String... params) 
    {

            // Do all your background task here

            return result;
                    
    }
    @Override
     
    protected void onProgressUpdate(Integer... values) {
    
      
    }

    protected void onPostExecute(String result) {
    
    }
}

                
             
Share:
11,335
droidgren
Author by

droidgren

Updated on June 04, 2022

Comments

  • droidgren
    droidgren about 2 years

    **Updated: (See below)**I have been looking around for couple of days and can't find a straight answer to this. Some say it possible to some say to accomplish some say it's not. I am getting crazy on this.

    What I want is just to have the AsyncTaskTask showing a progressbar an external class. To do this I am passing the context as you can see in the main class. But whatever I try I get NullPointerException.

    Working code examples is appreciated. Thank you

    Using Android 2.2 by the way.

    main:

    import android.app.Activity;
    import android.os.Bundle;
    
    public class AsyncDemo extends Activity {
    
        @Override
        public void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.main);
            new AsyncClass(this).execute();
        }
    }
    

    AsyncClass.java

    import android.app.ProgressDialog;
    import android.content.Context;
    import android.os.AsyncTask;
    import android.os.SystemClock;
    
    public class AsyncClass extends AsyncTask<Void, String, Void> {
        private Context context;
        ProgressDialog dialog = new ProgressDialog(context);
    
        public AsyncClass(Context cxt) {
            context = cxt;
        }
    
        @Override
        protected void onPreExecute() {
            dialog.setTitle("Please wait");
            dialog.show();
        }
    
        @Override
        protected Void doInBackground(Void... unused) {
            SystemClock.sleep(2000);
            return (null);
        }
    
        @Override
        protected void onPostExecute(Void unused) {
            dialog.dismiss();
        }
    }
    

    Update: I have a follow up question: Using the above code, is it possible to return a value from the onPostExecute method back to the main class, somehow? (Sorry about beeing noobish) I have tried something like this:

    String result = new AsyncClass(this).execute();
    

    and then a method that return back a string. But I can't do that because i got:

    Type mismatch: cannot convert from AsyncTask<String,Void,Void> to String
    

    What can I do to tackle this problem? Thanks.