通过 AsyncTask 将值从第一个活动传递到第三个活动
Posted
技术标签:
【中文标题】通过 AsyncTask 将值从第一个活动传递到第三个活动【英文标题】:Pass Value from First Activity to Third Activity via AsyncTask 【发布时间】:2017-06-14 16:11:28 【问题描述】:我有一个在线订购系统,用户至少可以通过三个步骤完成订购。以下每个步骤都是一个单独的活动:
-
选择计划
选择开始日期
根据步骤 1 中选择的计划选择内容。
现在我在第 1 步中所做的是,一旦用户点击计划和订单,下面的代码就会运行 onClick。
Intent intent = new Intent(context, SelectDate.class);
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
Bundle extras = new Bundle();
extras.putString("pass_selected_meal_plan_id",mp_id_pass);
extras.putString("pass_selected_meal_name",mp_name_display);
intent.putExtras(extras);
context.startActivity(intent);
Toast.makeText(context, mp_name_display+" Selected",
Toast.LENGTH_SHORT).show();
在第二个活动中没有,我要求用户选择订单开始日期。这也很简单,没有任何问题。但是当我尝试切换到第三个活动时,问题就开始了。
由于我的第三个活动内容取决于第一个活动中所做的计划选择,因此我必须将所选ID转移到第三个活动中。我在第二个活动的 Extra Bundle 中有它作为“pass_selected_meal_plan_id”。
我加载第三个活动的方式也很关键。有两种可能的方式来启动第三个活动。首先非常简单,只需将 onClick 放在下一步按钮上即可。我认为转移所需的选择也将非常简单。但在这种情况下,据我所知,作为 android 应用程序开发的初学者,我将不得不提供一个按钮来根据所选计划单击和加载内容。
第二种方式是我想要使用的。我在第二个活动 onClick Next 中运行 AsyncTask。它工作得很好。唯一的原因是我无法从上一个活动(即第一个活动)中获取 onPostExecute 中的Extras。
我什至愿意使用全局变量,但不知道该怎么做。知道什么是全局变量,我不太热衷于使用它们。
这是我的 onPostExecute 代码:
@Override
protected void onPostExecute(String result)
Intent intent = new Intent(ctx, SelectMeals.class);
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
Bundle extras = new Bundle();
//Instead of "1" I want the value from previous Activity, which already available in Extras from previous Activity
extras.putString("pass_selected_meal_plan_id", "1");
//This is the second value I want to be transferred from first activity to the third activity
extras.putString("pass_selected_meal_name","Test");
intent.putExtras(extras);
ctx.startActivity(intent);
如果有人能提供帮助将不胜感激。
【问题讨论】:
您说第二个活动具有第一个活动提供的捆绑包中的 id。实际上是什么阻碍了你?无法从 bundle 中取出 id? 感谢您的快速回复。问题是我无法在 onPostExecute 中获取值,因为在那里定义了下一个活动的 Extras。如果我在没有 AsyncTask 的情况下传输它,它工作得很好。换句话说,这个问题的解决方法可以是把之前activity的getExtras赋值给onPostExecute中的puExtras。 【参考方案1】:你可以使用下面的代码
在你的第二个活动中
// declare global variables
String id;
String name;
在onCreate
中使用下面的代码
Bundle bundle = getIntent().getExtras();
//Extract the data…
id = bundle.getString("pass_selected_meal_plan_id");
name = bundle.getString("pass_selected_meal_name");
现在在您的 Asynctask 中,在启动第三个活动之前编写以下代码。
@Override
protected void onPostExecute(String result)
Intent intent = new Intent(ctx, SelectMeals.class);
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
Bundle extras = new Bundle();
extras.putString("pass_selected_meal_plan_id",id); // first activity data
extras.putString("pass_selected_meal_name",name); // first activity data
intent.putExtras(extras);
ctx.startActivity(intent);
最后,您可以在第三个活动中获取这些值。
我想强调的一个重点是避免使用通用变量名,例如ID。它仅用于此答案中的参考,但这不是一个好主意。这样做可能面临的一个明显问题是使用 Refactor > Rename。它甚至会改变 XML 文件中的 @+id。
【讨论】:
感谢您的快速回复。我有一种感觉,这可能会奏效。我唯一需要指导的是如何声明全局变量。其实我是新手,所以需要指导。再次感谢您... 非常感谢兄弟。它真的很有帮助。我也想出了全局变量。真的很感激...以上是关于通过 AsyncTask 将值从第一个活动传递到第三个活动的主要内容,如果未能解决你的问题,请参考以下文章
JMeter - 将值从第一个 JDBC 请求传递到第二个 JDBC 请求
multiprovider - 将值从第一个提供者传递到第二个提供者