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

Eug*_*gun 21 android android-asynctask android-activity

我有一个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));


}
Run Code Online (Sandbox Code Playgroud)

在哪里

    private Context context;
Run Code Online (Sandbox Code Playgroud)

在执行此代码后的LogCat中,我得到了一个Java.lang.NullPointerException.像我这样开始一个活动是否可行和正确?

UPD 我补充说

    private Context mContext;


public YoutubeAndYahooParser(Context context) 
{
    super();
    this.mContext = context;
}
Run Code Online (Sandbox Code Playgroud)

初始化上下文和调用

YoutubeAndYahooParser youtubeAndYahooParser = new YoutubeAndYahooParser(ResultsQueryActivity.this);
                    youtubeAndYahooParser.execute("my string to pass in asynctak");
Run Code Online (Sandbox Code Playgroud)

在PostExecute之后

Intent intent = new Intent(mContext, ResultsQueryActivity.class);
 intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
 mContext.startActivity(intent);    
Run Code Online (Sandbox Code Playgroud)

我添加了新的标志因为我在LogCat中有下一个:

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

我对吗?

dha*_*g23 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));
    }
}
Run Code Online (Sandbox Code Playgroud)

你会这样称呼它:

   new MyAsyncTask(context).execute();
Run Code Online (Sandbox Code Playgroud)

  • 您还需要设置标志活动新任务 - 否则您将获得运行时异常:Intent i = new Intent(context,MyActivity.class); i.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); context.startActivity(ⅰ); (12认同)

小智 18

我刚试过这个...它在PostExecute方法中有效!!!

Intent intent_name = new Intent();
intent_name.setClass(getApplicationContext(),DestinationClassName.class);
startActivity(intent_name);
Run Code Online (Sandbox Code Playgroud)