0

为简单起见:我正在开发一个小应用程序,我们希望在其中单击多个对象。单击对象时,它应该播放声音。

这很好用,除了不时,整个应用程序(包括 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,索引:11,标志:0)01-17 14:52:10.174:D / AudioManager(17963):setStreamVolume(streamType:3,索引:11,标志: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 freed 338K, 49% free 3061K/5895K, external 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;
}
4

2 回答 2

0

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

于 2012-01-17T14:16:14.647 回答
0

好吧,没关系=(

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

我的错!

于 2012-01-17T22:43:33.347 回答