当前位置:操作系统 > 安卓/Android >>

(android乱七八糟)关于OnClickListener事件中加switch语句,内存溢出问题

说老实话,对android内存这块不是很清楚,今天无意中用到了这种。

 

是这样的,我从A这个activity中转到B这个activity中同时根据A中的点击事件传递一个相应参数key过去。

 

在B这个activity中取出key值。

 

然后B这个activity对应的界面中有一个按钮,这个按钮要添加一个事件,

 

处理B中按钮事件的时候要根据参数key的值调用不同的处理方法。

 

于是,我就在B这个activity中写了一个事件监听器,由于key可能值比较多,所以我在监听器里面加了一个switch语句来根据不同的key调用不同的函数。

 

于是问题出现了,其他一切正常,但是点击B中按钮的时候前几次没问题,

 

(一般是前三次正常)后面点了之后就出现问题了,没有反应了。程序关不了,也卸载不了只有重启虚拟机、

 

感觉是没问题的,于是我想是不是内存溢出的问题了,事件监听是个神奇的东西。一个叫内存溢出的外国网站上果然找到了这个问题

 

还真是内存溢出了

 

Having separate anonymous OnClickListener for each Button is taking up more memory. Casting View to Button is unnecessary. Using if-else when switch is possible is slower and harder to read. In Android's source you can often notice comparing the references by if-else:

大概意思就是说用if else来代替switch ,OnClickListener 会占用比较多的内存。

 

这里外国人还提到,switch会运行的比if else慢并且难以阅读?不知道是以前c语言基础没学好还是什么的、、不过我记得老师是说的用switch是为了使结构更清晰和容易阅读

啊(苍天,what's wrong?)

 

再往后面看,我觉得我的key的可能值实在太多了点,用if else实在臃肿。于是后面有个man给出了这样的解决方法。

 

Or you can try the same but without listeners:

on your Button xml definition:

android:onClick="ButtonOnClick"
And in your code define the method ButtonOnClick:

public void ButtonOnClick(View v) {
    switch (key{
      case xx:
        doSomething1();
        break;
      case xx:
        doSomething2();
        break;
......      }   
}
 就是说不用监听器就行。 算是暂时解我之难啊、、 写在后面-----------------  对于手机系统来说,不论是android,还是IOS还是其他什么系统。OnClickListener还是其他监听,监听嘛,毕竟都要一直开着本来就耗费宝贵的资源了(我不知道是不是有释放监听的说法哈,我不懂)再在里面加一些耗费资源的东西就一定会造成溢出(switch啊,循环什么的)。所以把把onClick加在界面处理中,触发是调用一个方法来处理是不错的解决方案。


摘自 虚怀若谷

补充:移动开发 , Android ,
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,