安卓:AsyncTask 推荐使用私有类还是公共类?

43

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

虽然到目前为止结果相同,但这让我想知道...我们应该:

  • 将AsyncTasks作为私有类嵌入到使用它们的活动中;
  • 或将AsyncTasks作为单独的公共类,接收活动的上下文。

这些方法中是否有任何一种被Google推荐?

根据您的经验,这些方法有什么优点、缺点和问题?

2个回答

36

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

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

这些优点和缺点是我脑海中的。我相信其他人会有额外的想法。

更新:

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


1
使用它们作为单独的公共类一段时间后,我发现它更加有用。 - neteinstein
14
对于AsyncTask来说,一个内部类(相比于一个嵌套的静态类)总是错的,出于技术原因:一个Activity可能会被销毁(例如由于配置更改),而不停止AsyncTask。如果AsyncTask是一个内部类,那么这将泄漏旧Activity,因为AsyncTask将具有对外部类实例的(隐藏)引用。然后,手机屏幕方向的几次改变就会导致进程因内存耗尽而死亡。 - Ted Hopp

7

无论使用什么代码最有意义,都不重要。重要的是要注意异步任务在活动被销毁后仍保持对活动的引用,无论是作为活动的内部类隐式地还是通过给予活动/上下文对象显式地。


4
请参考这个讨论解决AsyncTask引用Activity的(非常普遍的)问题。 - Ted Hopp

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接