【问题标题】:Intent putExtra(String,String) inside of AsyncTaskIntent putExtra(String,String) 在 AsyncTask 中
【发布时间】:2012-06-07 17:34:53
【问题描述】:

我只是想将一个字符串带到下一个活动中,而不必为该任务定义整个对象。我见过类似的解决方案并让它们工作但不使用 AsyncTask 来创建意图。

protected void onPostExecute(Boolean result) {
        if (loggedIn && hasPin) {

            Intent intent = new Intent(UniteActivity.this,
                    WebViewActivity.class);
            intent.putExtra(PASSED_USERNAME, passUser);
            startActivity(intent);
        }
        if (loggedIn && !hasPin) {

            Intent intent = new Intent(UniteActivity.this,
                    CreatePinActivity.class);
            intent.putExtra(PASSED_USERNAME, passUser);
            startActivity(intent);

PASSED_USERNAME 是一个公共静态常量,用于保存包名,正如 putExtra() 方法所需要的。然后我尝试在下一个活动中提取价值。

Intent extras = getIntent();

            String username = extras.getStringExtra(UniteActivity.PASSED_USERNAME);

            // carry username to next activity
            Intent intent = new Intent(CreatePinActivity.this,WebViewActivity.class);
            intent.putExtra(PASSED_USERNAME, username);
            startActivity(intent);

永远没有要拉出的字符串,用户名的值始终为空。我浏览了调试器,发现 Eclipse IDE 调试器在活动之间显示了不同的意图 ID,它们从来都不是一致的。 AsyncTask 是否有可能因为它分裂成一个单独的线程而受到某种干扰?

【问题讨论】:

  • 你的目标 Activity 的 launchMode 是什么?
  • 我没有明确定义。无论默认是什么。
  • AsyncTask 真的不应该有所作为。您是否进行了调试以确保您传入的用户名(在您将其放入 Intent 之前)不为空?
  • 查看this 问题,了解您可能拥有的选项。尝试使用 Bundle 类。我相信AsyncTask 不是这里的情况。
  • @Ryan Gray:顺便说一句……当您尝试在第二个Activity 中获取用户名时,您使用的是UniteActivity.PASSED_USERNAME。以这种方式让Activity 公开任何部分(常量、变量、方法等)是不好的做法。一个Activity 不应该访问另一个Activity 类的任何其他部分,并且大多数情况下它会失败(尤其是方法)。我建议在一切变得可怕之前改掉这个习惯。定义一个辅助类 (POJO) 来维护常量之类的东西或扩展 Application 并在其中声明它们。

标签: java android xml


【解决方案1】:

我不知道这是否适用于您的问题,因为我无法从您的代码 sn-p 中看到中间活动是否是新创建的。

但是:getIntent()-方法总是返回启动活动的第一个 Intent。如果活动保持在后台并接收到新的 Intent,则此值不会自动更新。您必须覆盖 onNewIntent(...) 并手动调用 setIntent(...) 才能使其正常工作(或直接在那里完成所有工作)。

因此,如果您没有在 onCreate() 方法中运行发布的代码,请检查您是否没有错过获取您感兴趣的真实意图。

【讨论】:

    【解决方案2】:

    不确定您的解决方案的确切答案。 您在 UI 上调用 startActivity,因为它在 postExecute() 中。

    如果所有其他方法都失败了,您可以将该值保存到共享首选项中。

    【讨论】:

      【解决方案3】:

      您处理变量 PASSED_USERNAME 的方式似乎不正确。您在一些宫殿中将其用作简单的 PASSED_USERNAME,而在其他一些地方您将其与名为 UniteActivity.PASSED_USERNAME 的类一起使用。因为它是一个公共静态常量,所以总是使用它以类名作为前缀。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2021-09-21
        • 2022-06-11
        • 2018-04-26
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多