web-dev-qa-db-ja.com

Android appのTikTok / Musical.lyとして機能を作成するにはどうすればよいですか?

画面1:GridView

enter image description here

画面2:詳細ページ

enter image description here

タスクの達成:

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

4
Chitrang

あなたが言ったように、あなたはアクティビティを書くか、アプリケーションでArraylistを使うことができると思います。または、最近Android Jetpack に表示されたライブラリである可能性があります。これは、アプリケーションのArraylistと性質が似ています。

ViewModel データの管理と保存を容易にするオブジェクト。これにより、アプリケーション内のさまざまなアクティビティまたはフラグメントのデータにアクセスできます。あなたはそれを試してみて、それがあなたに役立つことを願っています

1
Chanh

いくつかのオプションがあります。ここに私の意見を載せます。

最も簡単なのは、アクティビティまたはアプリケーションレベルで静的リストを作成することです。リストのメモリを使用後にNULLにして、解放していることを確認してください。

私が見つけた別の解決策は、列挙型でデータを渡すことですが、コメントによると、そのパフォーマンスについてはわかりません

上記の各アプローチには確かにいくつかの違いがあります。しかし、それは測定可能な違いではありません。各アプローチはリストをメモリに入れ、それを使用してから解放するからです。

上記の機能を実現するための最適で効率的なソリューションを探しています。

静的リストを作成し、使用後にNULLにします。最も効率的で簡単な方法になります。フラグメントのonDestroy()でリストをNULLにすることができます。

LiveData を使用できますが、アプリで1回使用するためだけにLiveDataライブラリを追加するのは得策ではないと思います。また、最初にそれを理解する必要があります。したがって、静的リストを使用できます。

アクティビティ

showFragment();
ApplicationClass.list = myList;

フラグメント内

onViewCreated(){
...
setAdapter(ApplicationClass.list);
...
}

onDestroy(){
   ApplicationClass.list = null;
}

重要

サーバーからすべてのデータを一度にプルすることは決して良い考えではありません。一度に数千人のユーザーがオンラインになる可能性があるため、アプリで最も必要なページ付けを行ってください

したがって、そのアプローチでは、フラグメントに渡すアイテムはごくわずかです。次に、フラグメントでページ付けを行います。

このアプローチでは、フローを少し変更するのに時間がかかります。しかし、あなたの場合で最も堅牢な方法です。

編集

すでにページネーションを使用していて、一度に大量のデータを取得している場合は、これも問題になります。ページネーションは、これらのメモリの問題を回避するために使用されるためです。

あなたは解決策として2つのことをすることができます。 1.一度に限られたデータを要求します。たとえば、要求ごとに50〜60個のアイテムを要求します。 2.インテントを渡すときに、リストから不要なフィールドをマップして削除できます。

私は最初のものを好むでしょう。

0
Khemraj