【问题标题】:How to create functionality as TikTok / Musical.ly for android app?如何为 Android 应用程序创建 TikTok / Musical.ly 的功能?
【发布时间】:2018-11-03 04:01:28
【问题描述】:

屏幕 1:GridView

屏幕 2:详细信息页面

任务完成:

1) 从服务器加载gridview中的所有视频。

2) 用户点击gridview item的任意位置。

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 在将数据从片段传递到活动时有更多数据(大约 100 多个 VideoPostModel 对象),则应用程序崩溃,因为有意图发送数据的限制(https://stackoverflow.com/a/37054839/3598052)。

Hacky Alternatives:

1) 静态数组列表

2) 应用类中的数组列表

寻找实现上述功能的最佳和高效解决方案。

任何有助于实现这一目标的建议、参考链接或代码将不胜感激,并提前致谢。

更新 1:

我发现的另一个解决方案是使用枚举传递数据,但根据 cmets,我不确定它的性能。参考:https://stackoverflow.com/a/14706456/3598052

【问题讨论】:

标签: android android-layout android-fragments android-intent android-viewpager


【解决方案1】:

我认为您可以在活动中编写或在应用程序中使用 Arraylist,如您所提到的。或者它可能是最近出现在 Android Jetpack 中的一个库。本质上类似于应用中的Arraylist。

ViewModel 可以更轻松地管理和存储数据的对象。 它允许您访问应用程序中不同活动或片段的数据。你试试看,希望对你有用

【讨论】:

    【解决方案2】:

    您有多种选择。我会在这里发表我的看法。

    最简单的方法是在活动或应用程序级别制作静态列表。只需确保您在使用后通过将其设为 NULL 来释放 List 内存。

    我发现的另一个解决方案是使用枚举传递数据,但按照 cmets我不确定它的性能

    上述每种方法肯定会有一些差异。但这不会是可测量的差异,因为每种方法都将 List 放入内存中,使用它然后释放它。

    寻找实现上述目标的最佳和高效解决方案 功能。

    制作静态List,使用后设为NULL。将是最有效和最简单的方法。 您可以在 Fragment 的 onDestroy() 中将 List 设为 NULL。

    您可以使用LiveData,但我认为添加 LiveData 库只是为了在应用程序中使用一次不是一个好主意。你也需要先了解它。所以你可以使用静态列表。

    活动中

    showFragment();
    ApplicationClass.list = myList;
    

    在片段中

    onViewCreated(){
    ...
    setAdapter(ApplicationClass.list);
    ...
    }
    
    onDestroy(){
       ApplicationClass.list = null;
    }
    

    重要

    从服务器一次提取所有数据绝不是一个好主意。请做您的应用最需要的分页,因为可能同时有成千上万的用户在线

    因此,通过这种方法,您只会将少量项目传递给 Fragment。然后你将在 Fragment 中进行分页。

    这种方法需要时间来稍微改变一下流程。但这是在您的情况下最可靠的方法

    编辑

    如果您已经在使用分页并且一次仍然获取大量数据,那么这又是一个问题。因为分页用于逃避这些内存问题。

    您可以做两件事作为解决方案。 1. 一次请求有限的数据,例如每次请求 50-60 项。 2. 传入intent时可以映射和删除列表中不需要的字段。

    我更喜欢第一个。

    【讨论】:

    • 感谢您的回答,但我认为您没有按照答案中的“重要”部分正确回答问题。我已经在做分页“pagination_index”了。但是,一旦将数据加载到带有分页的第一个屏幕中。我必须传递现有数据和最后一个分页索引。但问题是数据量很大,无法有意传递。
    • 您的数据包含哪些内容,仅在 100 个列表大小中超过 1mb?
    【解决方案3】:

    我知道我迟到了,但这会帮助一些未来的访客。

    添加分页和使用arraylist和点击位置传输数据到使用意图和之后的详细活动,设置点击位置的当前位置。 喜欢viewpager.setCurrentPosition(clickedPosition);

    【讨论】:

      猜你喜欢
      • 2012-03-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-12-18
      • 2019-11-07
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多