Android – How to correctly start activity from PostExecute in Android

androidandroid-activityandroid-asynctask

I have an AsyncTask, that fills a custom List with parsed data from Internet.

In PostExecute I fill that List and get it ready to transfer it to a new Activity.

I do it this way:

@Override
protected void onPostExecute(List<VideoDataDescription> result) 
{
    super.onPostExecute(result);
    MainActivity.progressDialog.dismiss();

    context.startActivity(new Intent(context, ResultsQueryActivity.class));


}

where context

    private Context context;

In LogCat after executing this code I get a Java.lang.NullPointerException.
Is this possible and correct to start an Activity as I do it?

UPD
I have added

    private Context mContext;


public YoutubeAndYahooParser(Context context) 
{
    super();
    this.mContext = context;
}

to initialize context and call

YoutubeAndYahooParser youtubeAndYahooParser = new YoutubeAndYahooParser(ResultsQueryActivity.this);
                    youtubeAndYahooParser.execute("my string to pass in asynctak");

After this in PostExecute

Intent intent = new Intent(mContext, ResultsQueryActivity.class);
 intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
 mContext.startActivity(intent);    

I added new flag because of I have got in LogCat the next:

*Calling startActivity() from outside of an Activity context requires the FLAG_ACTIVITY_NEW_TASK flag. Is this really what you want?*

Am I right?

Best Answer

You should pass in the application context rather than a context from the local activity. I.e. use context.getApplicationContext() and save that in a local variable in your AsyncTask subsclass.

The code might looks something like this:

public class MyAsyncTask extends AsyncTask {

    Context context;
    private MyAsyncTask(Context context) {
        this.context = context.getApplicationContext();
    }

    @Override
    protected Object doInBackground(Object... params) {
        ...
    }

    @Override
    protected void onPostExecute(List<VideoDataDescription> result) {
        super.onPostExecute(result);
        MainActivity.progressDialog.dismiss();

        context.startActivity(new Intent(context, ResultsQueryActivity.class));
    }
}

you'd call it like this:

   new MyAsyncTask(context).execute();