视图通胀是否在“活动”中缓存

时间:2013-04-30 20:38:45

标签: android view layout-inflater

我试着寻找一个明确的答案,但找不到它,所以在这里问。如果这是一个nOOb问题,请道歉。

我的问题是Android是否将视图通胀缓存在活动范围之外?

我写了一个示例应用程序,其中有2个活动

活动A. 活动B

只有一个启动按钮B.B的布局相当复杂。

B有一个视图存根,我计时了ViewStub通胀(基本上渲染了整个布局)。

当我计算B的布局膨胀需要多长时间时。第一次花了大约100ms。进一步的通货膨胀需要15-20毫秒。奇怪的部分是在几次迭代之后,随机B再次花费100+ ms进行充气。

我还验证了我的复杂活动(B)被摧毁并再次创建(当我从B回击并从A再次启动B时)

我在Android代码库中找不到任何可以解释为什么会发生这种情况的内容。

有人可以告诉我这个缓存在哪里发生。

以下是ComplexActivity onCreate和onDestroy的日志。我正在使用背压来破坏活动

04-30 13:32:09.879: I/testInflation(19298): onCreate setting up content view
04-30 13:32:09.895: I/testInflation(19298): onCreate content view set. Time took = 15 ms.
04-30 13:32:09.895: I/testInflation(19298): onCreate inflating ui
04-30 13:32:10.004: I/testInflation(19298): onCreate ui inflated. Time took = 108 ms. Total time into method = 123 ms.
04-30 13:32:12.450: I/testInflation(19298): activity destroyed
04-30 13:32:12.903: I/testInflation(19298): onCreate setting up content view
04-30 13:32:12.911: I/testInflation(19298): onCreate content view set. Time took = 13 ms.
04-30 13:32:12.911: I/testInflation(19298): onCreate inflating ui
04-30 13:32:12.926: I/testInflation(19298): onCreate ui inflated. Time took = 13 ms. Total time into method = 26 ms.
04-30 13:32:13.958: I/testInflation(19298): activity destroyed
04-30 13:32:14.379: I/testInflation(19298): onCreate setting up content view
04-30 13:32:14.395: I/testInflation(19298): onCreate content view set. Time took = 11 ms.
04-30 13:32:14.395: I/testInflation(19298): onCreate inflating ui
04-30 13:32:14.403: I/testInflation(19298): onCreate ui inflated. Time took = 11 ms. Total time into method = 22 ms.
04-30 13:32:15.223: I/testInflation(19298): activity destroyed
04-30 13:32:15.622: I/testInflation(19298): onCreate setting up content view
04-30 13:32:15.637: I/testInflation(19298): onCreate content view set. Time took = 11 ms.
04-30 13:32:15.637: I/testInflation(19298): onCreate inflating ui
04-30 13:32:15.645: I/testInflation(19298): onCreate ui inflated. Time took = 13 ms. Total time into method = 24 ms.
04-30 13:32:16.692: I/testInflation(19298): activity destroyed
04-30 13:32:17.934: I/testInflation(19298): onCreate setting up content view
04-30 13:32:17.950: I/testInflation(19298): onCreate content view set. Time took = 11 ms.
04-30 13:32:17.950: I/testInflation(19298): onCreate inflating ui
04-30 13:32:17.965: I/testInflation(19298): onCreate ui inflated. Time took = 18 ms. Total time into method = 30 ms.
04-30 13:32:19.020: I/testInflation(19298): activity destroyed
04-30 13:32:23.825: I/testInflation(19298): onCreate setting up content view
04-30 13:32:23.833: I/testInflation(19298): onCreate content view set. Time took = 12 ms.
04-30 13:32:23.833: I/testInflation(19298): onCreate inflating ui
04-30 13:32:23.848: I/testInflation(19298): onCreate ui inflated. Time took = 11 ms. Total time into method = 23 ms.
04-30 13:32:26.622: I/testInflation(19298): activity destroyed
04-30 13:32:27.145: I/testInflation(19298): onCreate setting up content view
04-30 13:32:27.161: I/testInflation(19298): onCreate content view set. Time took = 15 ms.
04-30 13:32:27.161: I/testInflation(19298): onCreate inflating ui
04-30 13:32:27.231: I/testInflation(19298): onCreate ui inflated. Time took = 69 ms. Total time into method = 85 ms.
04-30 13:32:28.200: I/testInflation(19298): activity destroyed
04-30 13:32:28.645: I/testInflation(19298): onCreate setting up content view
04-30 13:32:28.661: I/testInflation(19298): onCreate content view set. Time took = 11 ms.
04-30 13:32:28.661: I/testInflation(19298): onCreate inflating ui
04-30 13:32:28.747: I/testInflation(19298): onCreate ui inflated. Time took = 91 ms. Total time into method = 102 ms.

1 个答案:

答案 0 :(得分:0)

机器人:launchMode 关于如何启动活动的说明。有四种模式与Intent对象中的活动标志(FLAG_ACTIVITY_ *常量)结合使用,以确定在调用活动处理意图时应该发生什么。他们是:

“标准”

“singleTop”

“singleTask”

“singleInstance”

默认模式为“标准”。

一边是“standard”和“singleTop”活动,另一边是“singleTask”和“singleInstance”活动。具有“标准”或“singleTop”启动模式的活动可以多次实例化。实例可以属于任何任务,并且可以位于活动堆栈中的任何位置。通常,它们被启动到调用startActivity()的任务中(除非Intent对象包含FLAG_ACTIVITY_NEW_TASK指令,在这种情况下选择不同的任务 - 请参阅taskAffinity属性。)

相比之下,“singleTask”和“singleInstance”活动只能开始一项任务。它们始终位于活动堆栈的根部。此外,设备一次只能保存一个活动实例 - 只有一个这样的任务。

所以默认情况下它是标准的,而不是使用backstack中的活动。阅读有关android Activity堆栈的信息。当活动来自后台和所有。 当你再次启动活动时,它花费的时间更少,因为它在堆中有很多对象

根据这些文件,当活动从堆栈中走出来......它将被销毁。http://developer.android.com/guide/components/tasks-and-back-stack.html

但是当您启动它时,您的活动会花费不同的时间。这是因为系统的垃圾收集器在某段时间运行并将分配的内存清除为对象。因此,在启动活动A后,您将进入ACtivity B.现在您按下后退按钮: - 这意味着活动B将从堆栈弹出并将很快销毁。但是您在垃圾收集器运行之前启动该活动。这就是为什么花费更少的时间

做一件事,在破坏时运行System.gc()....或者在onPause()中写下finish()...你的活动将花费几乎相同的时间来扩充布局。