我正在我的Activity的onCreate()方法中为UI线程实例化我的Handler.(为了避免内存泄漏风险,Handler不是内部类,它是一个普通的类.)
由于一个Handler对应一个Thread,但是一个Thread可以拥有更多的处理程序(据我所知),每次调用onCreate()都会实例化一个新的Handler实例.因此,如果我的活动再次被重新创建(在onDestroy之后,但在此期间没有任何进程终止),onCreate()将添加另一个Handler而不删除旧的.(在Android源代码中,Handler只询问Thread的Looper并获取对其消息队列的引用.)
什么是最佳解决方案?我应该将一个Handler实例化为静态变量,然后在onCreate()中,我可以检查它是否为null.如果它是非空的,那么就没有必要实例化一个新的,对吧?
(不用说,在onDestroy()中,我将Handler实例中的Activity引用设置为NULL,因此Handler没有泄漏Activity或任何相关的东西 - 我的处理程序的处理方法检查它是否为null,并在需要时丢弃消息但是我的问题是Handler仍然是为了线程保留的,原因在前面的段落中我详细说明了,所以onCreate调用越多,附加到UI线程的Handler实例越多.我的静态解决方案是否正确?这并不重要,那么Android如何检测与当前线程关联的处理程序应该是GC-d?)
我正在尝试使用淡入 ( AlphaAnimation
) 效果。我的视图根目录包含全屏SurfaceView
(不是 GLSurfaceView),如果我使用mSurfaceView.startAnimation(mMyAnimation)
,它不起作用,什么也不会发生。
我想这是因为它是 aSurfaceView
而不是 a View
。解决办法是什么?(我希望整个屏幕淡入。)如果最简单的解决方案是将 a 括起来SurfaceView
,View
然后AlphaAnimation
在封闭的 上使用View
,那么执行此操作的确切代码是什么?(例如 XML)
我需要在循环中设置一个非常大的数组的元素.continue
在某些情况下,循环可能因此必须单独计算阵列位置.
我总是需要设置10 个连续的元素.(10是一个例子.在某些情况下,我可能需要30或更多.)
是k+c
(c = 0,1,2,......常数)还是k++
更好的方法?从下面的两个解决方案中哪个更有效,为什么?
int k = 0;
for (int i = 0; i < aVeryHighNumber; i++) {
if (continueRequired()) {
continue;
}
k = ... // get k as a result of a certain calculation
veryLargeArray[k++] = value0; // these values might be calculated on-the-fly
veryLargeArray[k++] = value1;
veryLargeArray[k++] = value2;
veryLargeArray[k++] = value5;
veryLargeArray[k++] = value4;
veryLargeArray[k++] = value5;
veryLargeArray[k++] = value6;
veryLargeArray[k++] = value4;
veryLargeArray[k++] = value7;
veryLargeArray[k++] …
Run Code Online (Sandbox Code Playgroud) 有一个拥有数十万条C#线的大型企业WPF应用程序.我最近被分配到了它.该应用程序也使用(最新版本)第三方组件(众所周知的第三方组件提供商,我不想列出它们).
仅对某些合作伙伴发生内存泄漏.他们在早上启动应用程序并使用它几个小时才能完全占用内存并最终变慢,他们必须重新启动它(每天几次).他们有Windows 10机器(但这可能没有意义).我无法重现泄漏.
合作伙伴允许我发布应用程序的特殊版本,但不允许使用Memory Profilers(他们希望使用该应用程序进行生产,并且附加的Profiler会降低它的速度).所以我的想法是:让我们发布一个记录所有内容的特殊版本,包括用户点击和处理"可疑"GC根源.正如我所说的,我不知道我必须调试的代码,因此我使用内存分析器确定了可能泄漏的GC根.(是的,我制作了可能的罪魁祸首清单,例如依赖属性,静态列表等,但到目前为止还没有运气.正如我所说,我不太了解源代码,但我可以访问它并且可以修改它的任何部分.)
我实际上是在编写一个编程问题:除了用户行为和访问静态变量之外,我应该记录什么?也许我应该在每次用户操作后记录空闲内存.什么是适合的.NET方法?
合作伙伴将在重新启动应用程序之前复制并发送日志文件.
引用文档:
注意:从Android 3.2(API级别13)开始,当设备在纵向和横向之间切换时,"屏幕大小"也会更改.因此,如果要在开发API级别13或更高级别(由minSdkVersion和targetSdkVersion属性声明)时由于方向更改而阻止运行时重新启动,则除了"orientation"值之外,还必须包含"screenSize"值.也就是说,你必须decalare android:configChanges ="orientation | screenSize"
我需要忽略screenSize
配置更改.我的最低SDK级别为8(Android 2.2),目标SDK级别为13.因此,我需要在清单中引入它.
但是,Eclipse无法识别它,因为其Android设置设置为2.2.所以我把它改成了适当的级别,现在它正确构建.
但是,我担心在screenSize
配置更改尚未提供的旧版本中会出现问题.(例如,当应用程序在Android 2.2.设备上运行时.)也就是说,应用程序在读取清单时会崩溃,因为screenSize
它将是一个未知值.或者它会在3.2之前的设备上忽略它?
PS:我现在没有机会在真实的设备上进行测试,在这样一个关键问题上,我不会相信模拟器.
java android android-manifest screen-size android-configchanges
android ×4
java ×2
android-view ×1
arrays ×1
c# ×1
element ×1
handler ×1
memory-leaks ×1
oncreate ×1
screen-size ×1
surfaceview ×1
windows-10 ×1
wpf ×1