パフォーマンスのチューニング:ViewPagerの高速切り替え時のカートンのソリューション-Fragmentコンテンツの遅延ロード

2583 ワード

一、需要
会社のクライアントプロジェクトは比較的に膨大で、トップページのViewPagerは十数個のFragmentがあって、急速に切り替える時、カートン現象が発生しやすいです.
二、分析
ViewPagerが現在のFragmentに切り替わると、Fragmentはレイアウトをロードしてコンテンツを表示し、ユーザがこのときに素早くViewPagerを切り替わる、すなわちFragmentがUIコンテンツをロードする必要があり、また頻繁にFragmentを切り替わると、カートン現象が発生しやすくなる(ListViewがすばやくスライドしながらピクチャをロードするとカートンしやすい).
三、処理方案
1.Fragment軽量化
ViewPagerがロードするFragmentが比較的軽量である場合、Fragmentのレイアウトを適切に簡素化することで、Fragmentのロード速度を向上させ、カートン現象を緩和することができる.
2.Fragmentの廃棄防止
ViewPagerは切り替えの際、Fragmentを頻繁に破棄してロードするとカートン現象が発生しやすく、Fragmentの破棄を阻止することでカートン現象を効果的に緩和することができます.
 
(1)PagerAdapterでdestroyItemメソッドを上書きすることでFragmentの破棄を阻止
@Override
        public void destroyItem(ViewGroup container, int position, Object object) {
            //super.destroyItem(container, position, object);
        }

(2)PagerAdapterのsetOffscreenPageLimit()メソッドでは、いくつかのFragmentを保持するように設定することができ、パラメータを適切に大きくすることで、Fragmentが頻繁に破棄され、作成されることを防止することができる.
リスク:Fragmentが多い場合、一部のローエンド機ではOOM問題が発生しやすい.
3.Fragmentコンテンツ遅延ロード
(1)説明
現在のFragmentに切り替えると、直ちにFragmentの内容をロードするのではなく、まず簡単な空のレイアウトをロードし、それから遅延タスクを起動し、遅延時間はTであり、ユーザーがFragmentの滞留時間がTを超えた場合、ロードタスクを継続する.一方、ユーザが他のFragmentに切り替え、滞留時間がT未満の場合、この遅延タスクはキャンセルされる.
(2)具体的な操作
まず、遅延タスクの設定
 private Runnable LOAD_DATA = new Runnable() {
        @Override
        public void run() {

            //           Fragment 
        }
    };

タスクの開始
 @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
 
    //     ,              ,          
    initView();

    //    ,    500         
    handler.postDelayed(LOAD_DATA,500);
    
    return view;
}

 
   
  

Fragment

//  Fragment         
@Override
    public void setUserVisibleHint(boolean isVisibleToUser) {
        super.setUserVisibleHint(isVisibleToUser);

       if(!isVisibleToUser)
                mHandler.removeCallbacks(LOAD_DATA);
 }

(3)
setuUserVisibleHintを して、ユーザーが のFragmentに り えたかどうかを するには、ViewPagerがスライドを すると タスクがキャンセルされ、スライドオフセットが している 、ViewPagerは のFragmentにロールバックし け、 のFragmentのロードタスクがキャンセルされ、ロードタスクが されないという があります.
ここで が する は、ViewPagerにOnPageChangeListenerを し、このリスナーのonPageSelected(position)がViewPagerが どのFragmentに り えているかを し、ここで のFragmentの ロードタスクをキャンセルすることです.