Android:AsyncTask建议:私有类还是公共类?

net*_*ein 43 android android-asynctask

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

虽然到目前为止结果是一样的,但这让我感到疑惑...我们应该:

  • 使用AsyncTasks作为使用它们的Activities中的私有类.
  • 或使用AsyncTasks作为接收活动上下文的单独公共类

Google建议使用哪种方法?

您的经验对此有何看法(优点,缺点,问题)?

Ted*_*opp 36

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

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

这些优点和缺点是我的头脑.我相信别人会有额外的想法.

更新:

在此Google IO 视频中,内部AsyncTask选项明确标记为错误选项.

  • @NeTeInStEiN - 对于AsyncTask,内部类(与嵌套的静态类相比)由于技术原因总是错误的:可以在不停止AsyncTask的情况下终止Activity(由于配置更改).如果AsyncTask是一个内部类,这将泄漏旧的Activity,因为AsyncTask将具有对外部类实例的(隐藏)引用.电话的一些方向改变将导致该过程因内存耗尽而死亡. (14认同)

hac*_*bod 7

无关紧要,使用对您的代码最有意义的东西.重要的是观察在活动被销毁之后持有对活动的引用的异步任务,或者隐式地作为活动的内部类,或者通过给予活动/上下文对象来显式地.

  • 请参阅[此讨论](https://groups.google.com/forum/#!starred/android-developers/vwRrlc84gy0),以获取AsyncTask持有对活动引用的(非常常见)问题的解决方案. (4认同)