1. 程式人生 > >Android之Fragment懶載入

Android之Fragment懶載入

還記得以前使用ViewPager+Fragment時根本不考慮效率問題,一股腦的多頁資料載入導致卡死,還自我安慰說我設定了setOffscreenPageLimit了啊,而實際上跟蹤原始碼我們發現DEFAULT_OFFSCREEN_PAGES = 1,所以即便setOffscreenPageLimit我設定為0,ViewPager最少也會載入後一頁。為了保證效率現在都提倡一種懶載入的機制,即只有當前頁面為顯示頁面才會載入且只加載一次資料(做一次耗時操作:或網路請求或本地資料)。有同學說我可以拷貝原始碼把預設改為0啊,是可以這麼多,但是改變了viewpager的初衷,不夠靈活。在實際專案中我還是建議改造BaseFragment,利用setUserVisibleHint,暴露懶載入的方法,根據需要過載懶載入方法做實際操作。

下面來看具體的改造方法:

1.設定兩個標識

private boolean isViewPrepared; // 標識fragment檢視已經初始化完畢
private boolean hasFetchData; // 標識已經觸發過懶載入資料

2.建立懶載入的資料載入方法

/**  懶載入的方式獲取資料,僅在滿足fragment可見和檢視已經準備好的時候呼叫一次 */
protected void lazyFetchData() {    
Log.v(TAG, getClass().getName() + "------>lazyFetchData");
}

3.以上兩個標識值的判定:

  • 在onViewCreated方法中(即表明檢視已經準備完畢)isViewPrepared = true;
  • 在onDestroyView方法中(view被銷燬後,將可以重新觸發資料懶載入,因為在viewpager下,fragment不會再次新建並走onCreate的生命週期流程,將從onCreateView開始)hasFetchData = false; isViewPrepared = false;

4.判定是否需要載入資料

private void lazyFetchDataIfPrepared() {    
// 使用者可見fragment && 沒有載入過資料 && 檢視已經準備完畢    
if (getUserVisibleHint() && !hasFetchData && isViewPrepared) { hasFetchData = true; //已載入過資料 lazyFetchData(); } }

5.lazyFetchDataIfPrepared方法的呼叫時機

  • onViewCreated方法中呼叫lazyFetchDataIfPrepared方法,此時只有首頁會符合條件
  • setUserVisibleHint
@Override
public void setUserVisibleHint(boolean isVisibleToUser) {  
    super.setUserVisibleHint(isVisibleToUser);    
    Log.v(TAG, getClass().getName() + "------>isVisibleToUser = " +               isVisibleToUser);   
   if (isVisibleToUser) {//噹噹前為顯示頁面時
        lazyFetchDataIfPrepared();   
   }
}

6.子類Fragment根據需要過載lazyFetchData方法(訪問網路載入資料)

@Override
protected void lazyFetchData() {    
  ((DiscoverPresenter) mPresenter).getData();
}

整個改造就算結束了,是不是很簡單,為了不讓你的fragment不那麼累趕緊試試吧(如果還有不懂可以參照原始碼)。


下載地址:微影
原始碼地址:Ghost
歡迎大家下載和Star

相關推薦

AndroidFragment載入

還記得以前使用ViewPager+Fragment時根本不考慮效率問題,一股腦的多頁資料載入導致卡死,還自我安慰說我設定了setOffscreenPageLimit了啊,而實際上跟蹤原始碼我們發現DEFAULT_OFFSCREEN_PAGES = 1,所以即便s

AndroidFragment載入

一、背景 在Android應用中,ViewPager是我們不可避免使用的一個控制元件,因為它可以使我們在佔用較少空間的同時,增強內容的豐富性,同時以其內部流淌著Google的血液,所以它幾乎成了每一個App的標配控制元件。但是,假如ViewPager的每一個Fragment都需要通過網路拉取資料

Android使用setUserVisibleHint()實現Fragment載入

Fragment 懶載入使用場景 當使用viewpager+adapter作為應用大的佈局時,viewpager會通過setOffscreenPageLimit來設定預載入的專案,不設定setOffscreenPageLimit,則預設為1(設定0無效,可以檢視該方法原始碼知道),也就是

Android多個fragment載入的坑(卡頓)

在Android開發中,有很多種情況都是viewpage+fragment左右滑動進行佈局的,例如下面的今日頭條 在今日頭條app上,我們可以看到,其頂部都是一欄的型別資料來源,可滑動,可聯動下面的viewpage裡的fragment,但是很多時候,viewpage+fragment中

android Fragment載入,當頁面可見時載入資料

// 儲存之前的介面,否則會重新呼叫onCreateView viewPager.setOffscreenPageLimit(fragmentList.size()); fragm

【java】itoo項目實戰hibernate 載入優化性能

bsp xtra extra pda 程序 前端框架 外連接 獲取 轉換成 在做itoo 3.0 的時候,考評系統想要上線,就開始導入數據了,僅僅導入學生2萬條數據,可是導入的速度特別的慢。這個慢的原因是由於導入的時候進行了過多的IO操作。可是導入成功之後,

AndroidVolley框架載入網路圖片

更多幹貨 分散式實戰(乾貨) spring cloud 實戰(乾貨) mybatis 實戰(乾貨) spring boot 實戰(乾貨) React 入門實戰(乾貨) 構建中小型網際網路企業架構(乾貨) python 學習持續更

Swift 4.0學習載入

九: 懶載入 懶載入是一個在專案中特別常用的東西,在OC中,一般是通過重寫getter方法來實現,但是在Swift裡,多了一個叫 lazy 的修飾符,多麼形象生動的命名。具體應用舉例如下:

Xamarin.AndroidFragment Walkthrough

利用Fragment設計能夠相容不同螢幕的應用 這裡我們先圍觀下最後的成果圖,給讀者打打氣: 普通手機上顯示的結果: 在平板上顯示的結果: 筆者要鄭重宣告下,雖然看似是兩種不同的顯示效果,但是同一個應用,而下面筆者將逐步教會大家如何利用Fragment製作出能夠相容不同螢幕的應用。

Android打造自己載入高清大圖及瀑布流框架.解決錯位等問題.

    首先看效果圖如下:     本框架支援本地圖片和網路圖片的獲取.採用LruCache演算法,最少使用的最先釋放.有效的避免OOM,專案結構圖:          核心載入類在於ImageLoader.採用了TreadPool去做併發請求.UI處理採用Handler

fragment 載入2

效果 老規矩,先來看看效果 效果圖 ANDROID和福利兩個Fragment是設定的Fragment可見時載入資料,也就是懶載入。圓形的旋轉載入圖示只有一個,所以,如果當前Fragment正處於載入狀態,在離開該Fragment時需要隱藏載入動畫,因為另一個Fragment並不一定處於載入狀態,當返回F

Android網路圖片載入的5種基本方式

學了這麼久,最近有空把自己用到過的網路載入圖片的方式總結了出來,與大家共享,希望對你們有幫助。此部落格包含Android 5種基本的載入網路圖片方式,包括普通載入HttpURLConnection、HttpClients、Volley、XUtils、OkHttp等網路載入圖片

AndroidFragment

碎片是什麼   碎片(Fragment)是一種可以嵌入在活動當中的UI片段,它能讓程式更加合理和充分地利用大螢幕的空間,因而在平板上應用的非常廣泛。雖然碎片對你來說應該是個全新的概念,但我相信你學習起來應該毫不費力,因為它和活動實在是太像了,同樣都能包含佈局,同樣都有自己的

AndroidFragment的靜態使用

1 Fragment的產生與介紹 》 Fragment,也就是碎片,本意是為了適配大螢幕的安卓裝置而生的。執行Android的裝置繁多,螢幕大小更是多種多樣。針對不同螢幕尺寸,通常情況下,開發者都是先針對手機開發一套原始碼,然後拷貝一份,修改佈局以適應大

iOS---tableview載入圖片的時候的優化lazy(載入)模式and非同步載入模式

舉個例子,當我們在用網易新聞App時,看著那麼多的新聞,並不是所有的都是我們感興趣的,有的時候我們只是很快的滑過,想要快速的略過不喜歡的內容,但是隻要滑動經過了,圖片就開始載入了,這樣使用者體驗就不太好,而且浪費記憶體.              這個時候,我們就可以利

爬蟲圖片載入技術、selenium和PhantomJS

爬蟲之圖片懶載入技術、selenium和PhantomJS   圖片懶載入 selenium phantomJs 谷歌無頭瀏覽器   一.圖片懶載入 什麼是圖片

androidFragment的bug解決

最近做一個功能,當第二次進入一個介面的時候出現一個奇怪的bug,如下面詳細的log資訊: 10-01 13:36:23.549: E/AndroidRuntime(14188): Process: com.android.settings, PID: 14188 10-01

AndroidFragment動態新增和移除Fragment

fragment_demo.xml<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"

多層巢狀後的 Fragment 載入實現

多層巢狀後的 Fragment 懶載入 印象中從 Feed 流應用流行開始,Fragment 懶載入變成了一個大家都需要關注的開發知識,關於 Fragment 的懶載入,網上有很多例子,GitHub 上也有很多例子,就連我自己在一年前也寫過相關的文章。

Androidfragment的基本使用

1.在xml中佈局 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"     xmlns:tools="http://schemas.android.com/tools"