views:

61

answers:

1

*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.

+4  A: 

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();
        }
    }
SSZero
Thank you! You made my day!
droidgren
The problem is that the ProcessDialog is instantiated before the constructor is called. Therefore context is null. Moving the instantiation of the ProcessDialog into the constructor like this ensures that context holds the value passed in cxt. Also, you don't realy need to store the context as a field in this sample. Just pass cxt to ProgressDialog constructor (i.e. dialog = new ProgressDialog(cxt)).
Emil H