我想弄清楚为什么我的应用程序使用了这么多内存.我经常看到它使用15到18MB之间,这远远高于我的预期.我通过DDMS查看了堆大小,看到了这个:

这看起来有点可疑,因为我的应用程序根本不处理大图像.事实上,我的应用程序中drawables的总和大约是250KB.所以我创建了一个堆转储并使用MAT来找到所有这些内存的去向.byte []数组是迄今为止最大的消费者,所以我深入研究并注意到以下内容:

我完全不知道为什么sPreloadedDrawables负责这么高的保留堆大小.我也不知道如何确定根本原因,或者如何"修复"它.
我应该从哪里出发?我的应用程序主要通过不处理图像数据的服务在后台运行.我确实有用户可以选择使用的活动,但同样,他们使用的小型drawable不能解释如此大的堆大小.我还检查了任何令人讨厌的活动泄漏事件等,但没有找到任何.
编辑:我注意到在模拟器中运行时堆大小要大得多.这很令人困惑.:/
我目前正在为我的一个活动使用沉浸式模式(API 19),如下所示:
getWindow().getDecorView()
.setSystemUiVisibility(
View.SYSTEM_UI_FLAG_LAYOUT_STABLE
| View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION
| View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN
| View.SYSTEM_UI_FLAG_HIDE_NAVIGATION
| View.SYSTEM_UI_FLAG_FULLSCREEN
| View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY
| View.INVISIBLE);
Run Code Online (Sandbox Code Playgroud)
这会隐藏系统按钮和通知栏,直到用户向后滑动它们.这工作正常,但是我想检测用户何时再次显示按钮.我已经尝试了OnSystemUiVisibilityChangeListener但是它不会触发这个特定的事件.
有任何想法吗?
我喜欢滚动浏览Google+应用中的帖子时出现的动画,但我无法弄清楚他们是如何实现的.
当它们出现时,会采用什么技术来制作帖子?我不是在寻找动画本身,而是我如何将任何动画应用于可滚动项目列表.
谢谢.
目前我有代码来淡化亮度调整,看起来像这样:
new Thread() {
public void run() {
for (int i = initial; i < target; i++) {
final int bright = i;
handle.post(new Runnable() {
public void run() {
float currentBright = bright / 100f;
window.getAttributes().screenBrightness = currentBright;
window.setAttributes(window.getAttributes());
});
}
try {
sleep(step);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}.start();
Run Code Online (Sandbox Code Playgroud)
我不确定这是否被认为是好方法论(我考虑过使用ASyncTask,但我看不出这种情况下的好处).是否有更好的方法来实现背光衰减?
编辑:我现在使用TimerTask如下:
new Timer().schedule(new TimerTask() {
@Override
public void run() {
final float currentBright = counter[0] / 100f;
handle.post(new Runnable() {
public void run() { …Run Code Online (Sandbox Code Playgroud) 我一直在编写一个棋盘游戏的软件版本.到目前为止,我已经编写了与游戏板上的物理对象相对应的类.我很喜欢编写程序逻辑,但是我发现很多逻辑类都需要访问相同的对象.
起初我将相应的对象传递给方法,因为它们被调用,但这变得非常乏味,特别是当方法需要许多对象来执行它们的任务时.为了解决这个问题,我创建了一个初始化和存储我需要的所有对象的类.这允许我通过调用Assets.dice()从任何类访问对象.
但是现在我已经考虑过了,这似乎不对.这就是为什么我在这里,我担心我创造了某种神级.这种恐惧是没有根据的,还是我创造了灾难的秘诀?
只是想知道,有没有办法在Android手机上获得光传感器的价值,而无需等待onSensorChanged()事件发生?为了节省电量,我在获得单个lux值后使用registerListener()和unregisterListener(),但是下次我注册监听器以获取另一个值时,如果该值与之前相同,我的应用程序就坐在那里等待一个事件可能需要一段时间才会发生(通常在光线不足的情况下).
那么,有没有一种方法可以在不等待onSensorChanged()事件的情况下读取lux值?或者我应该只有100毫秒超时,然后使用我记录的最后一个值?
谢谢!
使用光传感器时,我遇到了一个永远不会触发onSensorChanged()事件的问题.原因是当监听器被注册时,如果勒克斯值保持不变,则没有变化,因此没有事件.但是,我仍然想知道勒克斯的价值!恒定勒克斯值0和常数60,000之间存在差异!
经过一些研究,我意识到没有办法直接读取传感器的勒克斯值.那么如果lux值是常数,如何获得lux值,从而永远不会触发事件?有没有办法最初设置一个假值(如-1),所以总会发生一个事件?或者我在考虑这个错误?
任何帮助将不胜感激!
我正在尝试以编程方式调整手机的亮度.我的应用程序中有一个半透明的活动,但用户无法点击它到它下面的活动/窗口.一旦设置了亮度,我就会终止此活动,但是我想在此活动中做更多的工作(例如逐渐调整亮度),这需要一些时间,而且我不希望用户点击他们的手机,想知道为什么他们的行动没有注册.
所以基本上,我需要创建一个模拟窗口,它将成功地允许我调整屏幕亮度而不显示,或者找出如何进行活动点击.我不知道怎么做.
顺便说一下,这是在Activity中进行亮度调整的代码:
android.provider.Settings.System.putInt(getContentResolver(),
android.provider.Settings.System.SCREEN_BRIGHTNESS, Math.round(SOME_BRIGHTNESS * 255f));
Window window = getWindow();
window.getAttributes().screenBrightness = SOME_BRIGHTNESS;
window.setAttributes(window.getAttributes());
float sysBrightPer = getSystemBrightness(getApplicationContext());
new Thread() {
public void run() {
try {
sleep(BRIGHT_TIMEOUT);
} catch (InterruptedException e) {
e.printStackTrace();
}
finish();
}
}.start();
Run Code Online (Sandbox Code Playgroud)
有什么建议?
PS我在市场上发现了这个应用程序.我想知道这种方式是否会对我有所帮助?https://market.android.com/details?id=com.haxor
我有一个小部件,只要有配置更改(例如屏幕方向),每当手机解锁时,它都会自动更新.此过程涉及onClick为我的小部件上的按钮设置处理程序.这很好用,但是我发现有一个使用案例会导致我的应用无法响应onClick事件.这种特殊情况是每当启动器重新启动时.
有没有办法检测启动器何时重启,所以我可以手动更新我的小部件?或者还有另一种方法可以确保onClick处理程序不会丢失吗?
基本上我想用一个AlphaAnimation淡出一个TextView,然后改变它的文本TextView,然后最后再用另一个淡化它AlphaAnimation.但我不知道如何按顺序执行此操作.实现这一目标的最佳方法是什么?
android ×9
java ×2
animation ×1
brightness ×1
coding-style ×1
ddms ×1
events ×1
fading ×1
google-plus ×1
launcher ×1
light ×1
object ×1
oop ×1
widget ×1
window ×1