【问题标题】:Android: AsyncTask recommendations: private class or public class?Android:AsyncTask 推荐:私有类还是公共类?
【发布时间】:2011-01-28 01:23:42
【问题描述】:

我目前正在一个团队中开发一些 Android 应用,在过去几个月中我们使用了两种不同的方法(一种是我个人喜欢的,另一种是其他开发者喜欢的)。

虽然到目前为止结果是一样的,但这让我想知道......我们应该:

  • 在使用它们的活动中将 AsyncTask 用作私有类。
  • 或将 AsyncTasks 用作接收活动上下文的单独公共类

是否有 Google 推荐的任何方法?

您对此有何经验(优点、缺点、问题)?

【问题讨论】:

    标签: android android-asynctask


    【解决方案1】:

    内部类非常适合表示私有对象或与封闭类密切相关的对象。偶尔有使用内部类的技术原因(例如,模拟闭包)。他们还减少了命名空间污染。

    内部类的一个缺点是,如果它们访问封闭类的私有成员(字段或函数),编译器将为这些成员生成访问器函数。语言纯粹主义者会争论这种封装的破坏是好事还是坏事。访问函数为每次访问增加了一些开销(这通常不是一个因素,但确实存在)。另一个缺点是它使源文件更复杂,因此更难管理。 (我偶尔会因为在内部类中编辑一个函数而认为它在外部类中而被刺痛,反之亦然。)最后,内部类往往不可重用,而单独的类通常可以参数化以具有多种用途.

    这些优点和缺点不在我的脑海中。我相信其他人会有更多的想法。

    更新:

    在此 Google IO video 中,内部 AsyncTask 选项被明确标记为错误选项。

    【讨论】:

    • 一段时间后将它们用作单独的公共类,我发现它更有用。
    • @NeTeInStEiN - 对于 AsyncTask,由于技术原因,内部类(与嵌套的静态类相比)总是错误的:可以在没有停止异步任务。如果 AsyncTask 是一个内部类,这将泄漏旧的 Activity,因为 AsyncTask 将具有对外部类实例的(隐藏)引用。手机的一些方向变化会导致进程因内存耗尽而死。
    【解决方案2】:

    没关系,使用对您的代码最有意义的东西。重要的是要注意在 Activity 被销毁后持有对 Activity 的引用的异步任务,或者隐式地作为 Activity 的内部类,或者显式地通过给定 Activity/上下文对象。

    【讨论】:

    • 请参阅this discussion,了解 AsyncTask 持有对活动的引用的(非常常见的)问题的解决方案。
    猜你喜欢
    • 2015-12-19
    • 2016-03-27
    • 1970-01-01
    • 2011-05-29
    • 1970-01-01
    • 2011-11-06
    • 1970-01-01
    • 1970-01-01
    • 2021-12-26
    相关资源
    最近更新 更多