我的是surefaceview里的动画。当然是用线程处理的。之前的线程逻辑是完全没错的。项目跑了一个晚上都不会出错,后来因为需求,改了。加了很多的bitmap。但我都释放掉了。我看了log里,GC一直都在清除占用的内存,这个毋庸置疑。但最后给我的结果就是,界面卡在那里不动,等你再操作的时候就有报错(这个错误肯定是点击事件报错的。应该是界面卡死,dispatchingevent在流到某个view的时候,view没有给他反应,无法接受事件所造成的。)
06-10 10:34:00.475: ERROR/ActivityManager(58): ANR in com.cn.SuperCharacter (com.cn.SuperCharacter/.SuperCharacter)
06-10 10:34:00.475: ERROR/ActivityManager(58): Reason: keyDispatchingTimedOut
06-10 10:34:00.475: ERROR/ActivityManager(58): Load: 13.57 / 4.66 / 2.59
06-10 10:34:00.475: ERROR/ActivityManager(58): CPU usage from 60472ms to 476ms ago:
06-10 10:34:00.475: ERROR/ActivityManager(58):   .SuperCharacter: 5% = 0% user + 4% kernel / faults: 590 minor 8 major
06-10 10:34:00.475: ERROR/ActivityManager(58):   system_server: 2% = 1% user + 0% kernel / faults: 692 minor 19 major
06-10 10:34:00.475: ERROR/ActivityManager(58):   adbd: 1% = 0% user + 1% kernel / faults: 20 minor
06-10 10:34:00.475: ERROR/ActivityManager(58):   qemud: 0% = 0% user + 0% kernel / faults: 2 minor
06-10 10:34:00.475: ERROR/ActivityManager(58):   ronsoft.openwnn: 0% = 0% user + 0% kernel / faults: 186 minor
06-10 10:34:00.475: ERROR/ActivityManager(58):   events/0: 0% = 0% user + 0% kernel
06-10 10:34:00.475: ERROR/ActivityManager(58):   re-initialized>: 0% = 0% user + 0% kernel / faults: 112 minor
06-10 10:34:00.475: ERROR/ActivityManager(58):   com.svox.pico: 0% = 0% user + 0% kernel / faults: 79 minor
06-10 10:34:00.475: ERROR/ActivityManager(58): TOTAL: 7% = 2% user + 5% kernel + 0% softirq
求高手鉴定!!!我增加的功能主要在bitmap方面,我在画动画的时候,在canvas里加了很多的固定位图,放在bitmap里。然后线程去调用,调用完就释放掉了。如果是oom的错误的话,就肯定有报错的。但现在是没有报错,界面卡着没动。界面卡死的N种情况。(所有耗时的代码全部在线程里调用。不会有界面5秒未响应的问题。)跪求!

解决方案 »

  1.   

    keyDispatchingTimedOut  这个就表明楼主的主线程处理不过来了,一个可能是你的内存不够,另一个是因为你的图片过多的放入到内存,或者你操作过快,总体来讲还是你的机器配置,其次是你的内存回收做的不到位
      

  2.   

    我每次释放bitmap里的内存是用handler线程里做的。btm.isRecycled() 判断btm.recycle();来释放。释放大小我对比了下,差不多。我想,用btm.recycle();这样的释放应该是问题不大吧!如果这样的释放,还是占很大的内存的话,那bitmap还有啥用?除非还有更高招。btm.recycle();本来就是专门用来释放的。虽然也不是立即都释放的。至少这个是为了防止oom准备的。
    我接受你说的操作过快。我也在改这个!在线程了。还有画图的一个动作,我并没有放在线程里去。
      

  3.   

    我调出来了。也并不是因为动作快了。很奇怪的一个东西。逻辑无法解释。我的线程中有这样的写法
    while(b){
     if(boolean){
       //这个地方是一个动作
     }else{
       //这地方是另一个动作
     }
    }我把动作分开了。就完全没事。最开始的设计我也是分开的。所以一直没报错。无解。。
    求解!
      

  4.   

    我也正遇到过类似的问题:我的问题是在线播放一段视频一会儿后视频界面就卡住不动了,在对视频按暂停键就报ANR,我这是间歇性的。我所有的耗时操作都放在线程中做的。log显示cup消耗很少。
    不知道什么原因导致这错误。
      求解啊!!!