【问题标题】:android intents and callbacksandroid意图和回调
【发布时间】:2011-02-02 00:06:03
【问题描述】:

我正在浏览 android 教程,而有关意图/活动交互的一些内容让我感到困惑。在 Javascript 中,每当有 ajax 调用时,我们都会定义结果应如何与 ajax 调用一起处理,并且我们可以在整个应用程序生命周期中为不同的 ajax 调用使用不同的回调。在android中,以意图启动一个活动并处理传回的结果是解耦的,至少在教程中是这样完成的,并且只有一个入口点来处理结果,因此很难即时执行处理结果而不弄乱主要入口点。我可以很容易地想象一些复杂的逻辑可能会使主入口点内部的切换变得一团糟。这是一个基本的 android 架构,还是有另一种方法可以使用实际的回调而不是单个入口点中的 switch 语句来做事?

【问题讨论】:

  • @Falmarri:真的吗?我想所有那些说人们通过比喻和比较来学习的认知科学家一定是白白赚了几百万。我以函数式编程,并且它在任何语言中都是干净的风格,所以除非你对我的问题有实际答案,否则请为其他人保存毒液。
  • 您能否更具体地说明您认为哪些元素很麻烦?此外,如果您愿意,任何 switch 语句都可以轻松转换为哈希表查找和回调调度。
  • @adamp 我认为繁琐的是根本需要 switch 语句。这类似于onClickListener。我个人发现为每个可点击项目提供一个使用内部类的回调函数比为所有可点击项目使用一个 onClickListener 并使用 switch 语句来查看哪个项目被点击要干净得多。不过,这有点风格/个人喜好。
  • @davidk01 不,这对于活动结果是不可能的。仅适用于点击侦听器。请参阅下面的回答,了解我对活动结果的最佳建议。
  • @Falmarri 回调函数的概念相当普遍,当然不是 javascript 独有的。它的实现可能因语言而异,但几乎所有语言(包括 Java)都有某种实现方式。

标签: android callback android-intent


【解决方案1】:

确实,您只能在一个位置接收活动已完成的响应。如果你可以为每个函数定义一个回调函数就好了,但它不是这样工作的。

不过,根据我的经验,您很少会从一项活动中获得如此多不同的目的地,以至于难以管理。通常,每个页面只会指向您可能关心从中获取结果的一两个其他页面。

您可以执行以下操作来明确区分每种情况的逻辑:

void onActivityResult(int requestCode, ....) {
  switch(requestCode) {
     case Activity1:
        onActivity1Result(...);
        break;
     case Activity2:
        onActivity2Result(...);
        break;
  }
}

【讨论】:

  • @Davidk01 等等,这就是答案?我一定没有理解这个问题。您想知道是否可以从 switch 语句中调用其他方法来清理您的代码?
  • @Nick:这是最合理的答案。我希望在活动产生点将回调与意图结合起来,但看起来这是不可能的。我认为回调是一种更自然的编程方式,尤其是在涉及 GUI 元素时。在允许它的语言中,我习惯于构建可调用结构,然后在正确的时间调用它们。从喋喋不休看来这在 android 中是不可能的,我将不得不坚持使用 switch 语句。
  • @davidk01:你开始了多少活动,你期望从中得到结果?这可能是你问题的真正根源。如果您有超过 1 或 2 个使用 startActivityForResult 调用的活动,您可能应该重新考虑您的设计以更好地解耦活动。
  • @Davidk01 很公平,只是想确定一下。我认为选择反对回调是因为强调解耦组件。我无法想象(虽然,我不是专家)你将如何以纯粹基于 uri 的意图调用的方式构建回调。我想这是值得考虑的事情。
  • @Nick Campion 和@Davidk01 Java 确实通过(通常是匿名的)内部类进行回调。这些对于点击处理程序之类的东西是可能的。由于它只是一个类,因此可以根据需要对其进行序列化。我的猜测是这种情况下的困难在于调用 Activity 可以在被调用的 Activity 可见期间被杀死并重新创建。创建回调模型可能并非不可能,但比创建一个简单的点击处理程序要困难得多,因为在这种处理程序中,所有内容都应保持在范围内。
【解决方案2】:

意图和活动旨在允许开发人员开发可重用、松散耦合的组件。

我了解,在您正在创建的两个活动之间进行内部工作时,这些机制可能看起来会受到不必要的限制。限制性是平台开放性的一部分。用于启动您拥有的 Activity 的相同机制可以启动由其他开发人员或操作系统本身创建的 Activity。

话虽如此,在活动之间传递信息有很多选择。这真的取决于你想要完成什么。我试着从用户的角度来考虑活动。我将列出一些传递数据的机制,如果您想进一步描述您的应用程序或需求,我会尽力帮助您缩小选项范围:

  • Intent.putExtra
  • startActivityForResult(我假设你知道这个)
  • 共享首选项
  • 服务
  • 内容提供者

【讨论】:

  • 我已经按照 Intent.putExtra 的思路进行了思考,但我不确定当在 Intent 的活动之间来回传递大量参数时,如何自我记录这种代码.put 额外的。我希望通过将逻辑本地化到回调来避免参数爆炸。
  • @davidk01 由于至少需要在调用和被调用活动中访问意图额外内容,因此不可能将它们本地化在单个函数中。最好的办法是在一个一致的地方将它们声明为静态常量。我通常在被调用的活动中使用一致的命名方案(如 STRING_EXTRA_FOO 和 INT_EXTRA_BAR)来进行自我记录。
【解决方案3】:

另请注意,您不必为没有自己的屏幕(例如 Ajax 调用)的后台进程启动新活动 - 您可以使用 AsyncTask 代替,它允许 javascript 样式回调。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-01-12
    • 1970-01-01
    • 2011-02-09
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多