(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加在界面處理中,觸發是調用一個方法來處理是不錯的解決方案。

摘自 虛懷若谷

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *