ViewPager裏的Fragment的廣播監聽問題記錄

在此記錄下在本人項目裏遇到的一些問題,以供自己謹記,也許對你們有用。

項目裏用到ViewPager動態加載多個Fragment,並且都是同一個Fragment。

在操作時有發送廣播並接受廣播返回的數據且刷新Fragment數據源,然而當需要刷新某個Fragment裏的數據源時發現其他的Fragment的數據也跟着發生變化。

爲什麼呢,多次測試驗證發現給Fragment緩存有關。

1,大家都知道ViewPager默認是多緩存個Fragment,而且內部已經定死最少也要緩存一個。

於是分析到緩存個Fragment數據源也發生變變化了,而數據源發生變化的只有做的廣播裏,所以進行打印驗證了確實是這樣的。

2,廣播在緩存的Fragment裏同樣能監聽接收數據

那就在廣播監聽裏進行判斷下該Fragment是否可見。不可見的在廣播監聽裏不處理

	if (BroadcastActions.AT_GET_WW.equals(action)) {
                LogMsg.i("UIReceiver", "isVisible=" + isVisible() + getUserVisibleHint());
                if (getUserVisibleHint()) {
                   ...................//處理數據
                }
          }
這樣就可以解決問題。

3,緩存的Fragment是沒有hidden的。

細心的會發現我打印了isVisible()與getUserVisibleHint()結果是什麼樣的呢,兩個都可以進行判斷是否可見呢?

經過打印驗證是不一樣的如下圖:


可以看出緩存的Fragment的isVisible()是true!所以不能使用isVisible()進行判斷!

這是爲什麼呢,要看看源碼與註釋纔好更理解原因


看到註釋已經說的很明白了

(1) has been added, (2) has its view attached to the window, and (3) is not hidden.

看到第3點is not hidden與源碼的判斷就說明了。t是沒有hidden的

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章