<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          PreLoaderAndroid頁面啟動速度優(yōu)化利器

          聯合創(chuàng)作 · 2023-09-24 07:00

          預加載:android頁面啟動速度優(yōu)化利器,在頁面打開之前就預加載數據

          最新版本:  

          Activity打開之前就預加載數據,在Activity的UI布局初始化完成后顯示預加載的數據,大大縮短啟動時間。

          在任意處開啟預加載任務,并生成任務id,根據任務id可在任意處(一般是UI初始化完成后)開始對預加載的數據進行監(jiān)聽。

          • 開始進行監(jiān)聽時,若預加載任務未完成,則等待任務加載完成后執(zhí)行監(jiān)聽對象的回調方法

          • 開始進行監(jiān)聽時,若預加載任務已完成,則直接執(zhí)行監(jiān)聽對象的回調方法

          持續(xù)優(yōu)化中,歡迎watch、star關注!

          Demo

          Demo下載


          典型應用

          1. 在Application.onCreate中加載地址數據,在需要用到地址的頁面中獲取預加載的數據
          2. 在啟動頁中預加載app主頁所需的數據,減少用戶等待時間
          3. startActivity之前就開始預加載,UI初始化完成后顯示預加載的數據
          4. 復雜頁面(UI初始化耗時較多的頁面)內部在UI初始化開始之前預加載數據,UI初始化完成后顯示預加載的數據
          5. ListView/RecyclerView在上拉加載更多之前預加載下一頁的數據

          功能列表

          1. 支持網絡數據、網絡圖片、本地圖片、數據庫查詢及文件I/O等各種耗時操作的預加載

          2. 支持跨Activity預加載

          3. 支持下拉刷新(DataLoader重新加載一遍,加載完成后,回調所有DataListener)

          4. 支持自定義線程池

          5. 支持一個加載任務(DataLoader)對應多個監(jiān)聽器(DataListener)

          6. 支持為一個Activity配置多個預加載任務

          7. 支持后續(xù)添加/移除監(jiān)聽器(DataListener)

          8. 支持多個預加載任務分組管理

          使用方法

          1. 在build.gradle中添加依賴

          dependencies {
              compile 'com.billy.android:pre-loader:x.x.x'
          }

          2. 開啟預加載任務(如:在startActivity之前開啟)

          int preLoaderId = PreLoader.preLoad(new Loader());
          Intent intent = new Intent(this, PreLoadBeforeLaunchActivity.class);
          intent.putExtra("preLoaderId", preLoaderId);
          startActivity(intent);
          
          //預加載任務:模擬網絡接口請求獲取數據
          class Loader implements DataLoader<String> {
              @Override
              public String loadData() {
                  //此方法在線程池中運行,無需再開子線程去加載數據
                  try {
                      Thread.sleep(600);
                  } catch (InterruptedException ignored) {
                  }
                  return "data from network server";
              }
          }

          3. 在Activity(或Fragment)中UI初始化完成后開始監(jiān)聽預加載數據

          PreLoader.listenData(preLoaderId, new Listener());
          
          //數據加載完成后,會調用DataListener.onDataArrived(...)來處理加載后的數據
          class Listener implements DataListener<String> {
              @Override
              public void onDataArrived(String data) {
                  //此方法在主線程中運行,無需使用Handler切換線程運行
                  Toast.makeText(activity, data, Toast.LENGTH_SHORT).show();
              }
          }

          4. 刷新數據,DataLoader會重新加載一遍數據,加載完成后,所有的DataListener的回調方法會被執(zhí)行

          PreLoader.refresh(preLoaderId);

          5. 在使用完成后可以對預加載任務進行銷毀(如:在onDestroy中)

          PreLoader.destroy(preLoaderId);

          6. 用GroupedDataLoader和GroupedDataListener來開啟多個預加載任務(解決頁面中有多個預加載任務時id管理不方便的問題)

          //用GroupedDataLoader開啟一組預加載任務,共用同一個id
          int preLoaderId = PreLoader.preLoad(new Loader1(), new Loader2());
          Intent intent = new Intent(this, PreLoadGroupBeforeLaunchActivity.class);
          intent.putExtra("preLoaderId", preLoaderId);
          startActivity(intent);
          
          class Loader1 implements GroupedDataLoader<String> {
              @Override
              public String loadData() {
                  TimeWatcher timeWatcher = TimeWatcher.obtainAndStart("GroupedDataLoader1 load data");
                  try {
                      Thread.sleep(600);
                  } catch (InterruptedException ignored) {
                  }
                  return timeWatcher.stopAndPrint();
              }
          
              @Override
              public String keyInGroup() {
                  return "loader1";
              }
          }
          class Loader2 implements GroupedDataLoader<String> {
              @Override
              public String loadData() {
                  TimeWatcher timeWatcher = TimeWatcher.obtainAndStart("GroupedDataLoader2 load data");
                  try {
                      Thread.sleep(400);
                  } catch (InterruptedException ignored) {
                  }
                  return timeWatcher.stopAndPrint();
              }
          
              @Override
              public String keyInGroup() {
                  return "loader2";
              }
          }
          
          //在UI初始化完成后開始用GroupedDataListener對數據進行監(jiān)聽
          //GroupedDataListener 與 GroupedDataLoader 之間用key進行關聯
          // 可以一次開啟多個監(jiān)聽
          PreLoader.listenData(preLoaderId
                  , new DataHolder1()
                  , new DataHolder2()
          );
          //也可以分別監(jiān)聽
          PreLoader.listenData(preLoaderId, new DataHolder1());
          PreLoader.listenData(preLoaderId, new DataHolder2());
          
          class DataHolder1 implements GroupedDataListener<String> {
              @Override
              public void onDataArrived(String data) {
                  String s = allTime.stopAndPrint();
                  logTextView.append(data + "\n" + s + "\n");
              }
          
              @Override
              public String keyInGroup() {
                  return "loader1";
              }
          }
          class DataHolder2 implements GroupedDataListener<String> {
              @Override
              public void onDataArrived(String data) {
                  String s = allTime.stopAndPrint();
                  logTextView.append(data + "\n" + s + "\n");
              }
          
              @Override
              public String keyInGroup() {
                  return "loader2";
              }
          }

          配合組件化開發(fā)框架( CC )使用效果更佳

          CC框架自帶組件層級的AOP,在組件被調用打開Activity之前進行預加載,不需要在每個打開這個Activity的地方調用預加載。

          組件定義打開Activity的功能:

          public class ComponentA implements IComponent {
          
              @Override
              public String getName() {
                  return "demo.ComponentA";
              }
          
              @Override
              public boolean onCall(CC cc) {
                  int preLoaderId = PreLoader.preLoad(new Loader());
                  Intent intent = new Intent(this, PreLoadBeforeLaunchActivity.class);
                  intent.putExtra("preLoaderId", preLoaderId);
                  startActivity(intent);
                  CC.sendCCResult(cc.getCallId(), CCResult.success());
                  return false;
              }
          }

          調用打開PreLoadBeforeLaunchActivity的組件:

          //不需要執(zhí)行預加載,加載數據的邏輯在頁面所屬的組件內部完成
          CC.obtainBuilder("demo.ComponentA").build().call();


           

          瀏覽 25
          點贊
          評論
          收藏
          分享

          手機掃一掃分享

          編輯 分享
          舉報
          評論
          圖片
          表情
          推薦
          點贊
          評論
          收藏
          分享

          手機掃一掃分享

          編輯 分享
          舉報
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  特级西西444WWW高清大视频 | 95无码人妻精品一区二区三区 | 一级黄色日皮 | 69成人精品国产 | 欧美日皮的视频 |