由于logging / gc / audioManager,Android代码滞后

时间:2012-01-17 14:10:41

标签: java android garbage-collection android-logcat android-audiomanager

为了保持简单:我正在开发一个小应用程序,我们想要在彼此之后单击几个对象。在点击一个对象时,它应该发出声音。

这很好用,除了有时整个应用程序(包括LogCat的日志记录)只是冻结了大约5秒钟,之后它似乎赶上了。 (所有线程冻结) 追赶我的意思;如果你在冻结期间继续点击,解冻后,它仍然知道该怎么做。

日志很简单:

  

01-17 14:52:08.292:D / AudioManager(17963):setStreamVolume(streamType:3,index:11,flags:0)   01-17 14:52:08.473:D / dalvikvm(17963):GC_CONCURRENT释放417K,48%免费3113K / 5895K,外部140K / 647K,暂停2ms + 4ms

     

01-17 14:52:09.033:D / AudioManager(17963):setStreamVolume(streamType:3,index:11,flags:0)   01-17 14:52:09.484:D / AudioManager(17963):setStreamVolume(streamType:3,index:11,flags:0)   01-17 14:52:10.174:D / AudioManager(17963):setStreamVolume(streamType:3,index:11,flags:0)   01-17 14:52:10.785:D / AudioManager(17963):setStreamVolume(streamType:3,index:11,flags:0)   01-17 14:52:15.169:D / dalvikvm(17963):GC_EXPLICIT释放338K,49%免费3061K / 5895K,外部140K / 647K,暂停43ms

注意最后两个日志之间的5秒延迟。

我尝试删除所有音频,但这并没有解决任何问题 记录的文本文件也不会明显影响任何内容。

有没有人知道如何解决这个恼人的问题?
提前谢谢。

<小时/> 修改:
在冻结期间暂停程序时,它指向某种方法。什么可能导致这种冻结:

public synchronized boolean removeEntity(long id)
{
    for (Entity ent : this.entities)
        if (ent.getId() == id)
            return this.entities.remove(ent);

    return false;
}

2 个答案:

答案 0 :(得分:0)

垃圾收集器正在做很多工作。您是否尝试在DDMS中运行Allocation Tracker以找出所有这些内存的分配位置?如果这是游戏,请确保您没有在主循环中创建大对象。

答案 1 :(得分:0)

Oke,Nevermind =(

经过一天的调试后,我发现我用同步方法创建了一个旧的死锁。奇怪的是,当它没有连接到PC时它总是如何继续。

我的错误!