如何从Android中的PostExecute正确启动活动?

时间:2012-02-02 18:41:02

标签: android android-activity android-asynctask

我有一个AsyncTask,用来自Internet的解析数据填充自定义List。

在PostExecute中,我填写该List并准备将其转移到新的Activity。

我是这样做的:

@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;

在执行此代码后的LogCat中,我得到一个Java.lang.NullPointerException。 这样可以正确启动活动吗?

UPD 我添加了

    private Context mContext;


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

初始化上下文并调用

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

在PostExecute之后

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

我添加了新标志,因为我已经在LogCat中接下来了:

*从Activity上下文外部调用startActivity()需要FLAG_ACTIVITY_NEW_TASK标志。这真的是你想要的吗?*

我是对的吗?

3 个答案:

答案 0 :(得分:43)

您应该传入应用程序上下文而不是本地活动的上下文。即使用context.getApplicationContext()并将其保存在AsyncTask子类的局部变量中。

代码可能如下所示:

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));
    }
}
你会这样称呼它:

   new MyAsyncTask(context).execute();

答案 1 :(得分:18)

我刚试过这个...它适用于PostExecute方法!!!

Intent intent_name = new Intent();
intent_name.setClass(getApplicationContext(),DestinationClassName.class);
startActivity(intent_name);

答案 2 :(得分:0)

但是如果您根据从先前活动获得的响应(结果)开始一个新的Intent,那就更好了。

这将消除调用新的意图而导致错误响应的可能性。

例如,如果以前的活动应该成功返回...或欢迎以允许新的意图开始,那么我可以以此方式签出

  protected void onPostExecute(String result) {
       if (result.equals("Succesfully...")){
           context.startActivity(new Intent(context, Login_Activity.class));
           Toast.makeText(context, result, Toast.LENGTH_LONG).show();


       }else  if (result.contains("Welcome")){
           context.startActivity(new Intent(context, MainActivity.class));
       }else {
           Toast.makeText(context,result,Toast.LENGTH_LONG).show();
       }

    }