实践介绍

实践介绍

1.1 项目核心信息

本项目实现影视综艺节目列表及其历史数据查询,实现个人页面显示、个人页面粉丝和关注者列表、个人页面发布视频列表及其详情页。

1.2 项目服务地址

github.com/gujunhe/dou…

1.3GitHub地址

github.com/gujunhe/dou…

二、分工

团队成员主要贡献 I 负责基础设施、网络架构、房间架构搭建、个人页面发布视频列表及其详情页面、粉丝和关注者列表 xx 电影排行榜、粉丝和关注列表 xx 电视剧排行榜、粉丝和关注列表 xx 综艺列表、导航酒吧建设 xx 列表数据管理、导航栏建设 xx 电影列表布局、个人界面布局

三、实际实现

3.1 技术选型及相关开发文件

3.1.1 技术选型

导航
提供路由和导航服务
视图模型
具有生命周期感知的数据存储组件,用于存储应用页面所需的数据

在这里插入图片描述

改造

实现网络请求。

格森

用于与Retrofit和Room实现序列化和反序列化,自定义Type Converter将列表数据转换成Json存入数据库。

房间

该数据库与 LiveData 和 ViewModel 结合使用。当 Room 数据库中的数据发生变化时,可以通过 LiveData 组件通知 View 层自动更新数据。

实时数据

LiveData 是一个可观察的数据容器类,当 ViewModel 中的数据发生变化时会通知页面。

数据绑定

使用声明性格式将布局中的 UI 组件绑定到应用程序中的数据源,进一步减少页面与布局文件之间的耦合。

疼痛

列表分页组件实现数据预加载和按需加载。它与Room配合使用,数据直接来自Room数据库。当网络数据请求成功后,会直接写入Room数据库。由于使用了LiveData,当数据发生变化时,ViewModel会自动得到通知,数据也会自动更新。

毕加索

加载网络图片,实现占位图片和图片的自动缓存。

3.1.2 开发文档

协作模式

该项目是通过 GitHub 由团队协作开发的。

3.2 架构设计

本项目采用MVVM架构,在ViewModel层和Model层之间引入了Repository层。本地数据和网络数据之间的业务逻辑在 Repository 层处理,Repository 层负责 ViewModel 层,这样 ViewModel 只需要关心自己的业务逻辑,而不用关心数据的具体来源。当数据发生变化时,可以自动通知和更新接口,数据模型驱动接口更新。

在这里插入图片描述

下面是影视综艺节目单的代码示例

  1. RankFragment 持有 RankViewModel,从 RankViewModel 获取数据后,将数据加载到 recyclerview 中。

    rankViewModel.getRankItemByTypeAndVersion(type, "141").observe(getViewLifecycleOwner(), new Observer <List<RankItem.DataBean.ListBean> >() {
    @覆盖
    公共无效 onChanged (列表<RankItem.DataBean.ListBean>列表豆){
    如果(listBeans!= null){
    myItemRecyclerViewAdapter = new MyItemRecyclerViewAdapter(listBeans);
    recyclerView.setAdapter(myItemRecyclerViewAdapter);
    }
    }
    });
    复制代码

  2. RankViewModel持有rankRepository,通过rankRepository获取列表数据。

    公共实时数据<List<RankItem.DataBean.ListBean> > getRankItemByTypeAndVersion(字符串类型,字符串版本){
    返回 rankRepository.getRankItemByTypeAndVersion(type,version);
    }
    复制代码

  3. RankRepository 发出数据请求。

    公共实时数据<List<RankItem.DataBean.ListBean> > getRankItemByTypeAndVersion(字符串类型,字符串版本){
    返回 rankRepository.getRankItemByTypeAndVersion(type,version);
    }
    复制代码 public void refreshitembyTypeAndVersion(字符串类型,字符串版本)
    {
    apiService.getrankitem("application/json",MyApplication.clientToken.getValue(),type,version).enqueue(new Callback () {
    @覆盖
    public void onResponse(调用呼叫,响应回复) {
    if(response.body().getData().getList()!= null)
    {
    insertRankItem(response.body().getData().getList()); //插入数据库
    Log.d(TAG,response.body().getData().getList().toString());
    }
    }
    @覆盖
    public void onFailure (调用呼叫,可投掷 t) {
    }
    });
    }
    复制代码 私人无效insertRankItem(列表<RankItem.DataBean.ListBean>列表 )
    {
    AsyncTask.execute(new Runnable() {
    @覆盖
    公共无效运行(){
    for(int i= 0;i
    Log.d(TAG, list.get(i).toString());
    rankItemDao.insertRankItem(list.get(i));
    }
    }
    });
    }
    复制代码

  4. RankItemDao 返回一个 LiveData 对象来获取数据。当数据库中的数据更新时,会自动通知ViewModel,数据也会自动更新。

    @道
    公共接口 RankItemDao {
    @Insert(onConflict = OnConflictStrategy.REPLACE)
    void insertRankItem(RankItem.DataBean.ListBean rankitem);
    // 获取表中的所有数据
    @Query("SELECT *FROM rankitem WHERE type = :type")
    实时数据<List<RankItem.DataBean.ListBean> > findAllbytype(字符串类型);
    }
    复制代码

3.3 项目代码介绍

  • 适配器:各种适配器,包括自定义ViewBindingAdapter通过布局文件中的图片调用静态方法直接加载网络图片,FollowingPagedListAdapter和FansPagedListAdapter实现粉丝和关注列表的分页加载。

在这里插入图片描述

  • Database:数据库数据库,操作数据库的相关Dao,自定义@TypeConverter

在这里插入图片描述

  • 模型

在这里插入图片描述

  • 网络:Ap​​iService 接口和 RetrofitClient

在这里插入图片描述

  • ui:activity和fragment以及对应的Viewmodel层,Repository层(有些没用),SourceFactory用于分页加载,还有一些布局需要的功能。

在这里插入图片描述

  • view:自定义View,实现自定义底部导航栏,个人界面相关视图,实现顶部下拉图片放大放开图片反弹的视图

在这里插入图片描述

4. 测试结果

功能测试

本项目实现的所有功能均经过测试无误

性能测试

有使用Androidstudio自带的Profiler和手机自带的GPU渲染进行性能测试

5. 演示demo

录屏

(视频列表API超出限制,无法演示列表的版本切换)

演示链接

核心功能截图

影视综艺列表页面

在这里插入图片描述

个人页面和个人页面发布的视频列表

在这里插入图片描述

关注和粉丝列表

在这里插入图片描述

个人发布视频详情页面

在这里插入图片描述

六、实践总结与反思

6.1 仍然存在的问题

  • Clientsecret 和 access_token 未加密和存储。
  • 界面不够美观。
  • 没有编写任何代码来在 access_token 过期后自动刷新它。

6.2 确定的优化

  • 减少页面布局的嵌套,优化recyclerview的加载速度。
  • 对部分可复用代码进行可扩展封装,减少代码量,提高开发效率。
  • 优化项目结构

6.3 架构演进的可能性

6.4 项目过程中的反思与总结

这是第一次作为团队负责人通过团队协作完成一个项目。通过github在团队协作中还是遇到了很多困难,也学到了很多。项目刚建的时候,想用模块化来开发,方便团队协作,开发和维护,后来觉得项目不大,所以没有采用,导致后期团队协作困难。

在模仿抖音的个人界面实现下拉缩放和松手自动回弹的效果时,找了很多资料和解决方案,终于取得了不错的效果。得到了提振。

因为是第一次完成一个不算太小的项目,所以在架构和代码封装方面都没有做好。只是为了完成需要的功能,并没有对代码进行过多的扩展,也没有在写代码的时候写。详细说明,这些地方有待改进。

7. 其他补充资料(选填)

版权声明:本文为博主原创文章,遵循CC 4.0 BY-SA版权协议。转载请附上原文出处链接和本声明。

这篇文章的链接: https://homecpp.art/5004/6419/0928

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明

本文链接:https://www.qanswer.top/12252/58040411

posted @   哈哈哈来了啊啊啊  阅读(37)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
点击右上角即可分享
微信分享提示