首页 > 其他分享 >实践介绍

实践介绍

时间:2022-09-04 12:13:58浏览次数:90  
标签:代码 ViewModel 实践 介绍 列表 数据 数据库 页面

实践介绍

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

标签:代码,ViewModel,实践,介绍,列表,数据,数据库,页面
From: https://www.cnblogs.com/amboke/p/16654788.html

相关文章

  • postman教程(三)postman各模块介绍
    一、顶部及左侧工作栏1、MyWorkspace-可以单独或以团队的形式创建新的工作区。2、New,可以创建新的请求、集合或环境;还可以创建更高级的文档、MockServer和Monitor......
  • 报告分享|梅花数据:元宇宙品牌实践洞察报告
    原文链接:http://tecdat.cn/?p=28394 前言“元宇宙”⾃去年起,就成为科技界最热⻔的话题之⼀,科技公司、互联⽹⼤⼚纷纷布局元宇宙,抢占⻛⼝机会。在营销界,元宇宙的概念也......
  • 第十二章-DI容器和DI容器介绍
    DI容器本书的先前部分是关于一起定义DI的各种原理和模式的。如第3章所述,DI容器是一个可选工具,可用于实现许多通用基础结构,如果使用PureDI,则必须实现这些基础结构。在整......
  • 自我介绍
     大家好,我叫付安旭,我个人较为理智、敏锐、谨慎。个人的理智,主要体现在个人的行为通常不会被一时的情绪所左右,做事会极快的从情绪化转变为理智性,但个人深处的情感恐怕需要......
  • WinUI(WASDK)项目实践——优雅的开发上位机应用(新)
    摘要这就是一个记录自己进行WinUI项目实践的博客,项目开源地址如下,觉得有帮助的可以去看看,因为项目都开源了,所以保姆级的讲解肯定不如直接看代码来的实在了。电子脑壳项目......
  • Django基础介绍二
    数据的查,改,删先讲数据库中的数据全部展示到前端然后给每一个数据两个按钮一个编辑一个删除查看defuserlist(request):#查询出用户表里面所有的数据#方式1#data......
  • 自我介绍
    大家好,我是刘强。很高兴在此与大家见面,希望我们以后能够相互帮助,共同进步。如果说要用三个词来描述一下自己的话,我可能会选择“生活探索者”、“数码爱好者”和“音乐爱好......
  • 若依开源系统介绍
    参考资料1、gitee地址:https://gitee.com/y_project2、官方网站:http://www.ruoyi.vip/RuoYi-Vue基于SpringBoot,SpringSecurity,JWT,Vue&Element的前后端分离权限管......
  • 自我介绍
     hello大家好,我是杨渝,一个来自贵州剑河的小伙。如果要用三个词语来描述自己的话,我会选择自信,自强与坚韧。生长在并不富裕的家庭,我从小就感受过人生的不容易,也在父母亲的......
  • Git 初体验及其常用命令介绍-上
    在「Git的安装流程及步骤」一文中,我们已经把Git安装成功了,现在,就让我们一起体验Git的魅力吧!不知道大家是否还记得,在Git安装完成的时候,我们曾在GitBash中输入git......