溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

關于靜態(tài)常量造成的那些見鬼的情況我不得感慨一下

發(fā)布時間:2020-07-26 08:24:02 來源:網絡 閱讀:286 作者:屠夫章哥 欄目:移動開發(fā)


  1. 如果在一個類的成員位置定義了靜態(tài)變量,如果想類生成的時候這個變量初始化,就得在構造方法里初始化,而不能在成員位置。

  實際開發(fā)時的情景:友盟分享,分享的標題在后臺動態(tài)配置,沒有網絡的情況下顯示默認值。

   

  關于靜態(tài)常量造成的那些見鬼的情況我不得感慨一下


  見鬼的情況:在有網的情況下,分享之后,然后斷網分享的標題竟然不是默認的TITLE,而是之前從網絡獲取的分享標題。后來我苦思冥想,在成員位置明明初始化了,怎么沒有設置上默認的標題。

  問題解決:最終的問題還在于static關鍵字,static的生命周期。在有網的情況下分享成功之后TITLE被賦與了新值,而在TITLE所在的類(一個Popwindow)重新加載的時候,TITLE并不會隨著Popwindow的創(chuàng)建而創(chuàng)建,而是一直存在,一直保留著之前有網情況下分享的標題。


2.對于Adapter,如果它的數據源是靜態(tài)變量的,數據源變了,adapter不需要notifydatasetchanged就會改變adapter的ui.

  實際開發(fā)時的情景:Spinner加載數據

  關于靜態(tài)常量造成的那些見鬼的情況我不得感慨一下


  名師定制,是一個Fragment,Spinner的數據是通過一個叫做SpinnerData的類進行管理的,里面全部是靜態(tài)的變量和方法,在進入MainActivity里就通過getType()這個靜態(tài)方法來請求數據,請求成功之后會將數據解析給classObjects這個靜態(tài)的List。


  錯誤代碼1:在名師定制這個Fragment初始化的時候,

  

        classBeens.addAll(SpinnerData.classObjects);

  實際我在debug的時候,SpinnerData.classObjects是沒有真實的數據的。(在MainActivity里發(fā)起的異常請求還沒有成功的解析出數據)

   

  錯誤代碼2:作者以為SpinnerData里有數據,將數據賦值給函數的Spinner

initSpinner1(context, spinner1, SpinnerData.typeNames);
initSpinner2(context, spinner2, SpinnerData.GlassNames);

  這時我debug的時候SpinnerData.typeNames,SpinnerData.ClassNames仍然是沒有數據的。后面除了

左邊的Spinner點擊的時候會聯動右邊的Spinner,其它的沒有Spinner相關的數據請求操作。

  

  見鬼的情況:兩個Spinner竟然會有數據?。。。。。。。。?!于是我猜想靜態(tài)數據綁定adapter是不是不需要notify?做了下面一個試驗,給adapter綁定靜態(tài)的數據源,在按鈕點擊時只改變靜態(tài)數據源,這時ListView竟然添加了新的數據?。。。。。?!

  關于靜態(tài)常量造成的那些見鬼的情況我不得感慨一下  

  這就解釋了兩個Spinner怎么一開始設置的沒有數據的數據源竟然會顯示數據。

  同時還有另外一個bug:如果不點擊左邊的spinner,直接點擊右邊的spinner,崩潰報classBeans角標越界。還是Fragment一開始下面這行代碼的問題。

classBeens.addAll(SpinnerData.classObjects);

  因為在MainActivity里執(zhí)行的SpinnerData的getType請求網絡的方法,無法知道它何時回調成功。于是在SpinnerData類里寫了個監(jiān)聽器,監(jiān)聽它的數據回調成功。

 關于靜態(tài)常量造成的那些見鬼的情況我不得感慨一下

  在Fragment里設置監(jiān)聽:

  

@Override
public void initData() {
    //監(jiān)聽數據源的變化,因為是異步調用的,我不知道數據什么時候發(fā)生了變化。
    SpinnerData.setOnDataChangedListener(this);

 ...}

 

 

@Override
public void onDataChanged() {
    classBeens.clear();
    classBeens.addAll(SpinnerData.classObjects);
}

 

3.接入Geesee直播平臺,將它的Player寫成單例之后出現的問題:

    第一次進入app可以正常播放,再次進入就無法正常播放。如果卸載app重裝第一次進入也能

 正常播放,后來想想應該是Player的生命周期太長了,緩存太多播放的狀態(tài)。

 所以單例,static也要慎用??!


-------------------------------------------------------------------------------------

有時候越是這種見鬼的問題,越可能是我們對于一些概念并沒有真正的理解導致的。

  1. static

  2. 同步與異步




向AI問一下細節(jié)

免責聲明:本站發(fā)布的內容(圖片、視頻和文字)以原創(chuàng)、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI