画面1:GridView
画面2:詳細ページ
タスクの達成:
1)サーバーからグリッドビューのすべてのビデオをロードします。
2)ユーザーがグリッドビューアイテムの任意の位置をクリックします。
3)特定のビデオの詳細画面を開いて再生します。
4)垂直スクロールで、次または前のビデオを再生します。
現在の実装:
GridFragment {
ArrayList<VideoPostModel> videoPostList;
RecyclerView gridView;
onnItemClick() {
Intent intent = new Intent(this, DetailActivity.class);
intent.putExtra("data", videoPostList);
intent.putExtra("click_index", clickedIndex);
intent.putExtra("pagination_index", paginationIndex);
startActivity(intent);
}
}
DetailActivity {
VerticlaViewPager vertiCalViewPager;
ArrayList<VideoPostModel> videoPostList;
onCreate() {
videoPostList = getIntent().getParcelableArrayListExtra("data");
clickedIndex = getIntent().getIntExtra("clickindex", 0);
paginationIndex = getIntent().getIntExtra("pagination_index", 0);
VideoFragmentStatePagerAdapter viewPagerAdapter = new VideoFragmentStatePagerAdapter(videoPostList);
vertiCalViewPager.setAdapter(viewPagerAdapter);
}
}
問題:
フラグメントからアクティビティにデータを渡すときにvideoPostListにさらに多くのデータ(VideoPostModelの約100以上のオブジェクト)がある場合、意図的なデータ送信の制限があるため、アプリがクラッシュします( https://stackoverflow.com/a/37054839/3598052 )。
ハッキーな選択肢:
1)静的配列リスト
2)アプリケーションクラスの配列リスト
上記の機能を実現するためのOPTIMALおよびEFFICIENTソリューションを探しています。
これを達成するための提案、参照リンク、またはコードをいただければ幸いです。よろしくお願いします。
更新1:
私が見つけた別の解決策は、列挙型でデータを渡すことですが、コメントによると、そのパフォーマンスについてはよくわかりません。参照: https://stackoverflow.com/a/14706456/3598052
いくつかのオプションがあります。ここに私の意見を載せます。
最も簡単なのは、アクティビティまたはアプリケーションレベルで静的リストを作成することです。リストのメモリを使用後にNULLにして、解放していることを確認してください。
私が見つけた別の解決策は、列挙型でデータを渡すことですが、コメントによると、そのパフォーマンスについてはわかりません
上記の各アプローチには確かにいくつかの違いがあります。しかし、それは測定可能な違いではありません。各アプローチはリストをメモリに入れ、それを使用してから解放するからです。
上記の機能を実現するための最適で効率的なソリューションを探しています。
静的リストを作成し、使用後にNULLにします。最も効率的で簡単な方法になります。フラグメントのonDestroy()
でリストをNULLにすることができます。
LiveData を使用できますが、アプリで1回使用するためだけにLiveDataライブラリを追加するのは得策ではないと思います。また、最初にそれを理解する必要があります。したがって、静的リストを使用できます。
アクティビティ
showFragment();
ApplicationClass.list = myList;
フラグメント内
onViewCreated(){
...
setAdapter(ApplicationClass.list);
...
}
onDestroy(){
ApplicationClass.list = null;
}
サーバーからすべてのデータを一度にプルすることは決して良い考えではありません。一度に数千人のユーザーがオンラインになる可能性があるため、アプリで最も必要なページ付けを行ってください。
したがって、そのアプローチでは、フラグメントに渡すアイテムはごくわずかです。次に、フラグメントでページ付けを行います。
このアプローチでは、フローを少し変更するのに時間がかかります。しかし、あなたの場合で最も堅牢な方法です。
すでにページネーションを使用していて、一度に大量のデータを取得している場合は、これも問題になります。ページネーションは、これらのメモリの問題を回避するために使用されるためです。
あなたは解決策として2つのことをすることができます。 1.一度に限られたデータを要求します。たとえば、要求ごとに50〜60個のアイテムを要求します。 2.インテントを渡すときに、リストから不要なフィールドをマップして削除できます。
私は最初のものを好むでしょう。