我最近在一次关于Android的采访中被问了一些问题.我搜索了其中一些,但我找不到合适的资源和答案.所以我想在这里与大家分享.
在Android中使用的首选布局是什么(为了更好的内存消耗等)?我没有答案,面试官告诉我这是相对布局.这是真的 ?对此有何解释?
告诉我你为更好的内存消耗做的一些做法?我看了一下,但似乎还有其他东西.因为面试官提到一些与静态变量相关的事情比较好.
如果Android需要内存,它会杀死服务还是活动?优先问题.我也没有找到任何人讨论这个问题.面试官说服务的一些事情比活动具有高优先级(??),因此活动是被杀死的组成部分.这是真的 ?任何进一步的资源或解释?
请分享您对此问题的所有知识或资源.
当我从启动画面转到主要活动时,LeakCanary会显示以下内存泄漏.我知道这是由于Android操作系统本身的故障导致的预期泄漏,但有没有办法可以避免这种情况(通过在某处设置某些TextView的细节?)
D/LeakCanary? * LEAK CAN BE IGNORED.
D/LeakCanary? * com.gmspartnersltd.earthmiles.views.ActivitySignUp_ has leaked:
D/LeakCanary? * GC ROOT static android.text.TextLine.sCached
D/LeakCanary? * references array android.text.TextLine[].[1]
D/LeakCanary? * references android.text.TextLine.mCharacterStyleSpanSet
D/LeakCanary? * references android.text.SpanSet.spans
D/LeakCanary? * references array android.text.style.CharacterStyle[].[1]
D/LeakCanary? * references com.gmspartnersltd.earthmiles.views.ActivitySignUp$2.this$0 (anonymous class extends android.text.style.ClickableSpan)
D/LeakCanary? * leaks com.gmspartnersltd.earthmiles.views.ActivitySignUp_ instance
D/LeakCanary? [ 05-22 08:54:52.160 13969:18091 D/LeakCanary ]
* Reference Key: bb8124a9-2829-4ff3-8ded-13cf35f80f54
D/LeakCanary? * Device: Genymotion generic Google Nexus 5 - 5.0.0 - API 21 - 1080x1920 vbox86p
D/LeakCanary? * Android Version: …Run Code Online (Sandbox Code Playgroud) 我得到一个奇怪的Out of Memory错误解码一个可绘制的图像资源960x926px jpg,分配3555856字节.图像仅放在drawable-xxhdpi(3x)中,我使用的是hdpi(1.5x)设备.两个问题:
为什么我在堆中有足够的可用内存时会收到错误?
为hdpi设备分配应该是((960/2)x(926/2))x 4 = 888960字节(不是3555856)?
有人可以解释一下吗?
注意:问题是为什么在拥有22.5MB可用内存时获得3.5MB的OOM分配(参见日志)
03-18 17:30:15.050 32750-32750 /?D/dalvikvm:GC_FOR_ALLOC释放10809K,49%免费23735K/46087K,暂停89ms,总计89ms
03-18 17:30:15.050 32750-32750 /?I/dalvikvm-heap:强制收集3555856字节分配的SoftReferences
03-18 17:30:15.160 32750-32750 /?D/dalvikvm:GC_BEFORE_OOM释放29K, 49%免费23705K/46087K,暂停103ms,总计103ms
03-18 17:30:15.160 32750-32750 /?E/dalvikvm-heap:3555856字节分配的内存不足.
03-18 17:30:15.160 32750-32750 /?I/dalvikvm:"main"prio = 5 tid = 1 RUNNABLE
03-18 17:30:15.160 32750-32750 /?我/ dalvikvm:| group ="main"sCount = 0 dsCount = 0 obj = 0x418fc6a0 self = 0x4010c008
03-18 17:30:15.160 32750-32750 /?我/ dalvikvm:| sysTid = 32750 nice = 1 sched = 0/0 cgrp = apps handle = 1075251280
03-18 …
android android-image bitmapfactory android-memory android-bitmap
在我的一些应用程序中,我使用一些单例对象作为"管理器".我实例化它们Application.onCreate并将它传递给它ApplicationContext,我将它存储在一个WeakReference.
一些"管理器"方法在从a调用之后启动后台任务Activity,所以我将Activity's' 传递context给方法,并保持一个WeakReference到那个(并在其中使用AsyncTask).该引用一直保持,直到下一次的Activity调用转到后台的方法,当WeakReference设置为新Activity的context.
我的问题是,是否将ApplicationContext必须保持在WeakReference,并在那里与保持任何问题Activity的context这样呢?
我得到这个奇怪的OutOfMemoryError,虽然dalvikvm报告了足够的堆空间.日志:
12-09 14:16:05.527: D/dalvikvm(10040): GC_FOR_ALLOC freed 551K, 21% free 38000K/47687K, paused 173ms, total 173ms
12-09 14:16:05.527: I/dalvikvm-heap(10040): Grow heap (frag case) to 38.369MB for 858416-byte allocation
12-09 14:16:05.699: D/dalvikvm(10040): GC_FOR_ALLOC freed 6K, 21% free 38832K/48583K, paused 169ms, total 169ms
12-09 14:16:05.894: D/dalvikvm(10040): GC_FOR_ALLOC freed 103K, 20% free 38929K/48583K, paused 169ms, total 169ms
12-09 14:16:05.894: I/dalvikvm-heap(10040): Forcing collection of SoftReferences for 858416-byte allocation
12-09 14:16:06.074: D/dalvikvm(10040): GC_BEFORE_OOM freed 6K, 20% free 38922K/48583K, paused 182ms, total 182ms
12-09 14:16:06.074: E/dalvikvm-heap(10040): Out of …Run Code Online (Sandbox Code Playgroud) 我正在查看下面给出的命令输出
adb shell dumpsys meminfo com.imangi.templerun
但是,我无法正确理解这一点.
任何人都可以帮我理解这个吗?

拥有共享元素动画以及自定义输入动画会导致活动泄漏.
知道可能是什么原因?
09-21 16:19:31.007 28269-31066/com.sample.android D/LeakCanary? * com.feeln.android.activity.MovieDetailActivity has leaked:
09-21 16:19:31.007 28269-31066/com.sample.android D/LeakCanary? * GC ROOT android.app.ActivityThread$ApplicationThread.this$0
09-21 16:19:31.007 28269-31066/com.sample.android D/LeakCanary? * references android.app.ActivityThread.mActivities
09-21 16:19:31.007 28269-31066/com.sample.android D/LeakCanary? * references android.util.ArrayMap.mArray
09-21 16:19:31.007 28269-31066/com.sample.android D/LeakCanary? * references array java.lang.Object[].[1]
09-21 16:19:31.007 28269-31066/com.sample.android D/LeakCanary? * references android.app.ActivityThread$ActivityClientRecord.activity
09-21 16:19:31.007 28269-31066/com.sample.android D/LeakCanary? * references com.feeln.android.activity.MovieDetailActivity.mActivityTransitionState
09-21 16:19:31.007 28269-31066/com.sample.android D/LeakCanary? * references android.app.ActivityTransitionState.mEnterTransitionCoordinator
09-21 16:19:31.007 28269-31066/com.sample.android D/LeakCanary? * references android.app.EnterTransitionCoordinator.mEnterViewsTransition
09-21 16:19:31.007 28269-31066/com.sample.android D/LeakCanary? * references android.transition.TransitionSet.mParent
09-21 16:19:31.007 28269-31066/com.sample.android D/LeakCanary? * …
我看到不一致的文档和讨论有关Android内存不足时发生的情况以及操作系统重新声明内存的步骤.更具体地说,Android会以活动/片段或整个过程的粒度杀死吗?
例如,如果活动B在活动A前面启动(并且两个活动都是同一个应用程序/进程的一部分),活动A可以被操作系统杀死,而活动B位于前台,用户正在与活动B交互(假设:屏幕保持打开,当前应用程序保持在前台,没有发生方向更改)?
这个苏答案(在Android团队在谷歌的戴安娜Hackborn),从2011年表明,Android的杀死在流程的粒度,并不是一项活动.
在对Android开发者页面重新创建一个活动,它说:
如果系统当前已停止且未长时间使用或前台活动需要更多资源,系统也可能会破坏您的活动,因此系统必须关闭后台进程才能恢复内存.
注意歧义:"系统必须关闭后台进程 ".
在onSaveInstanceState的Android Developer页面上,它说:
例如,如果活动B在活动A前面启动,并且在某些时候活动A被杀死以回收资源,活动A将有机会通过此方法保存其用户界面的当前状态
在阅读了这些以及许多其他文档页面和在线讨论后,尚不清楚正确的答案是什么.
我也有关于片段的相同问题:由于内存不足而导致背景片段被杀死,而整个过程是否被杀死?
在构建我的第一个Android应用程序时,我注意到应用程序启动时内存使用率已接近20MB.我下载了Eclipse MAT并查看了内容,以便在内存中找到数百个(如果不是数千个)位图.其中很多都没有直接用在我的项目中(至少不是我所知道的那么多)
最大图像为9MB:https: //imagebin.ca/v/2eCK4JYLO2f2
其他更小:https: //imagebin.ca/v/2eCMmbFuIWsz
Android似乎已经竭尽全力通过使用zygote来减少内存...那么为什么内存中已经有这么多未使用的位图呢?
(基本项目是使用Android Studio的空白活动,片段由文本视图组成,简单地说"Hello World!")
android ×10
android-memory ×10
leakcanary ×2
memory-leaks ×2
adb ×1
ddms ×1
performance ×1
shell ×1