我有一个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标志。这真的是你想要的吗?*
我是对的吗?
答案 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();
}
}