如何为Android应用程序创建类似TikTok / Musical.ly的功能?

5

屏幕1:网格视图

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+)在从fragment传递数据到activity时有更多数据,则应用程序会崩溃,因为使用intent发送数据有限制(https://dev59.com/S2cs5IYBdhLWcg3w5H9a#37054839)。

巧妙的替代方法:

1) 静态arraylist

2) Application类中的arraylist

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

任何建议、参考链接或代码,指导实现此目标将不胜感激,谢谢。

更新1:

我发现的另一种解决方法是使用枚举传递数据,但根据评论,我不确定它的性能。参考:https://dev59.com/mmcs5IYBdhLWcg3wfD5P#14706456


尝试先加载前50个视频,然后在后台使用服务加载数据。 - Atif AbbAsi
有一个叫做EventBus的库可以帮助你解决这个问题。https://github.com/greenrobot/EventBus - Deepak S. Gavkar
请使用此类[https://gist.github.com/nesquena/d09dc68ff07e845cc622],在您的情况下将visibleThreshold设置为50。 - Tushar Lathiya
1
@droidev,可以参考这个链接https://dev59.com/buk5XIcBkEYKwwoY59_h#54896137。此外,Android已经推出了ViewPager2,您可能也想考虑使用它。 - Chitrang
@Chitrang,我遇到了一些问题,你能发一下你的联系方式吗? - droidev
显示剩余2条评论
3个回答

1
我认为您可以像您提到的那样在活动中编写或使用Arraylist。或者它可以是最近出现在Android Jetpack链接中的库。它与应用程序中的Arraylist性质相似。 ViewModel对象使数据管理和存储更加容易。它允许您在应用程序的不同活动或片段中访问数据。您可以尝试并希望对您有用。

0

我知道我来晚了,但这会帮助到一些未来的访问者。

使用arraylist添加分页并传递数据及点击位置到详细活动,使用意图,之后设置当前点击位置的位置, 例如viewpager.setCurrentPosition(clickedPosition)


0

你有几个选项。我会在这里提出我的意见。

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

我发现的另一个解决方案是使用枚举传递数据,但根据评论,我不确定它的性能如何。

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

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

创建静态List,并在使用后将其设置为NULL。这将是最有效和简单的方法。您可以在Fragment的onDestroy()中将List设置为NULL。

你可以使用LiveData,但我认为仅为应用程序中的一个用途添加LiveData库并不是一个好主意。此外,您需要先了解它。因此,您可以选择使用静态列表。

在Activity中

showFragment();
ApplicationClass.list = myList;

在片段中

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

onDestroy(){
   ApplicationClass.list = null;
}

重要提示

从服务器一次性获取所有数据并不是一个好主意。请使用分页功能,因为可能会有成千上万的用户同时在线,你的应用程序需要最多的就是这个。

因此,你可以采用这种方法,只将少量项目传递到Fragment中,然后在Fragment中进行分页。

这种方法需要花费一些时间来改变流程。但是,在你的情况下,这是最稳健的方式

编辑

如果你已经使用了分页功能,但仍然一次性获取大量数据,那么这又是一个问题。因为分页是用来避免这些内存问题的。

你可以采取两种解决方案: 1. 一次请求有限的数据,比如每次请求50-60个项目。 2. 当传递intent时,你可以映射和删除列表中不必要的字段。

我更喜欢第一种方法。


谢谢您的回答,但我认为您没有根据您在答案中的“重要”部分仔细阅读问题。我已经在使用“pagination_index”进行分页了。但是一旦数据在屏幕一中加载了分页,我必须传递现有数据和最后一个分页索引。但问题是数据量很大,无法通过意图传递。 - Chitrang
你的数据包含什么,以至于在列表大小只有100时就超过了1mb? - Khemraj Sharma

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接