(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 ,