パフォーマンスのチューニング: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の破棄を阻止
(2)PagerAdapterのsetOffscreenPageLimit()メソッドでは、いくつかのFragmentを保持するように設定することができ、パラメータを適切に大きくすることで、Fragmentが頻繁に破棄され、作成されることを防止することができる.
リスク:Fragmentが多い場合、一部のローエンド機ではOOM問題が発生しやすい.
3.Fragmentコンテンツ遅延ロード
(1)説明
現在のFragmentに切り替えると、直ちにFragmentの内容をロードするのではなく、まず簡単な空のレイアウトをロードし、それから遅延タスクを起動し、遅延時間はTであり、ユーザーがFragmentの滞留時間がTを超えた場合、ロードタスクを継続する.一方、ユーザが他のFragmentに切り替え、滞留時間がT未満の場合、この遅延タスクはキャンセルされる.
(2)具体的な操作
まず、遅延タスクの設定
タスクの開始
会社のクライアントプロジェクトは比較的に膨大で、トップページの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の ロードタスクをキャンセルすることです.