关于我在字节跳动青训营做了个抖音这件事

news/2024/5/9 12:03:38/文章来源:https://blog.csdn.net/Lbsssss/article/details/126665189

一、实践介绍

1.1项目核心信息

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

1.2项目服务地址

https://github.com/gujunhe/douyin

1.3GitHub地址

https://github.com/gujunhe/douyin

二、实践分工

团队成员主要贡献
负责基础架构、网络框架、room框架搭建、个人页面已发布视频列表及其详情页、粉丝和关注列表
XX电影榜单、粉丝和关注列表
XX电视剧榜单、粉丝和关注列表
XX综艺榜单、导航栏搭建
XX榜单数据管理、导航栏搭建
XX影视榜单布局、个人界面布局

三、实践实现

3.1 技术选型与相关开发文档

3.1.1技术选型

Navigation
提供路由导航服务
ViewModel
具备生命周期感知能力的数据存储组件,用于存放应用程序页面所需的数据
在这里插入图片描述

Retrofit

实现网络请求。

Gson

用来配合Retrofit、Room实现序列化和反序列化,自定义Type Converter将榜单List数据转化为Json存储到数据库中。

Room

数据库,与LiveData、ViewModel结合使用,当Room数据库中的数据发生变化时,能够通过LiveData组件通知View层,实现数据的自动更新。

LiveData

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

DataBinding

使用声明性格式将布局中的界面组件绑定到应用中的数据源,使页面与布局文件之间的耦合度进一步降低。

Paing

列表分页组件,实现数据预加载、按需加载,结合Room使用,数据直接来源于Room数据库。当网络数据请求成功后,会直接将其写入Room数据库,由于使用了LiveData,当数据有变化时,ViewModel会自动得到通知,自动完成数据的更新。

Picasso

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

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>>() {@Overridepublic void onChanged(List<RankItem.DataBean.ListBean> listBeans) {if(listBeans!=null) {myItemRecyclerViewAdapter = new MyItemRecyclerViewAdapter(listBeans);recyclerView.setAdapter(myItemRecyclerViewAdapter);}}
});
  1. RankViewModel持有rankRepository,通过rankRepository获取到榜单数据。
public LiveData<List<RankItem.DataBean.ListBean>> getRankItemByTypeAndVersion(String type,String version) {return rankRepository.getRankItemByTypeAndVersion(type,version);
}
  1. RankRepository进行数据请求。
public LiveData<List<RankItem.DataBean.ListBean>> getRankItemByTypeAndVersion(String type,String version) {return rankRepository.getRankItemByTypeAndVersion(type,version);
}
public void refreshitembyTypeAndVersion(String type,String version)
{apiService.getrankitem("application/json",MyApplication.clientToken.getValue(),type,version).enqueue(new Callback<RankItem>() {@Overridepublic void onResponse(Call<RankItem> call, Response<RankItem> response) {if(response.body().getData().getList()!=null){insertRankItem(response.body().getData().getList());//插入数据库Log.d(TAG,response.body().getData().getList().toString());}}@Overridepublic void onFailure(Call<RankItem> call, Throwable t) {}});
}
private  void insertRankItem(List<RankItem.DataBean.ListBean> list )
{AsyncTask.execute(new Runnable() {@Overridepublic void run() {for(int i=0;i<list.size();i++) {Log.d(TAG, list.get(i).toString());rankItemDao.insertRankItem(list.get(i));}}});
}
  1. RankItemDao获取数据返回的是LiveData对象,当数据库中的数据更新后,ViewModel会自动得到通知,自动完成数据的更新。
@Dao
public interface RankItemDao {@Insert(onConflict = OnConflictStrategy.REPLACE)void insertRankItem(RankItem.DataBean.ListBean rankitem);//获取表中所有数据@Query("SELECT *FROM rankitem WHERE type = :type")LiveData<List<RankItem.DataBean.ListBean>> findAllbytype(String type);
}

3.3 项目代码介绍

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

  • 数据库:数据库Database、操作数据库的相关Dao、自定义@TypeConverter
    在这里插入图片描述

  • model
    在这里插入图片描述

  • network:ApiService 接口和RetrofitClient
    在这里插入图片描述

  • ui:activity和fragment以及对应的Viewmodel层、Repository层(部分没有使用),分页加载的SourceFactory,以及一些布局所需要的函数。
    在这里插入图片描述

  • view:自定义View,实现自定义底部导航栏、个人界面相关view、实现顶部下拉图片放大松手图片回弹的view
    在这里插入图片描述

四、测试结果

功能测试

本项目所有已实现的功能经过测试无报错

性能测试

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

五、演示demo

录屏

(影视榜单api超出限制,无法演示榜单版本切换)

演示demo

核心功能截图

影视综艺榜单页面

在这里插入图片描述

个人页面及个人页面已发布视频列表

在这里插入图片描述

关注及粉丝列表

在这里插入图片描述

个人已发布视频详情页

在这里插入图片描述

六、实践总结与反思

6.1 目前仍存在的问题

  • 对clientsecret、access_token没有加密保存。
  • 界面不够美观。
  • 没有编写 access_token过期后自动刷新的代码。

6.2 已识别出的优化项

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

6.3 架构演进的可能性

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

第一次当组长通过团队协作完成项目,在通过github进行团队协作中还是遇到了不少困难,同时也学到了很多。在项目刚开始构建时,本想用模块化进行开发,以方便团队协作、开发和维护,但是后来觉得项目不大,就没有采用,后面导致团队协作遇到困难。

在模仿抖音个人界面实现下拉放大、松手自动回弹的效果时,查找了很多资料和方案,最后实现了比较好的效果,在这个过程中加深了对自定义view的理解,让自己的技术得到了提升。

由于是第一次完成一个不算小的项目,在架构方面、代码封装方面做得不太好,只是为了完成所要求的功能,没有对代码进行太多的扩展,在写代码时也没有编写详细的注释,这些方面应该要去改善。

七、其他补充资料(选填)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.luyixian.cn/news_show_5150.aspx

如若内容造成侵权/违法违规/事实不符,请联系dt猫网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

centos8同步时间安装时间校准服务

多余的话都写在教程的后面&#xff0c;直接进入下面的操作命令。下面所有的操作都必须使用root账户来操作。切记。 #1. 查看当前时间 date#2. 添加wlnmp源 rpm -ivh http://mirrors.wlnmp.com/centos/wlnmp-release-centos.noarch.rpm#3. 安装ntp服务 yum install wntp#4. 时间…

Python爬虫之Js逆向案例(10)-爬虫数据批量写入mysql数据库

最近收到小伙伴们的私信&#xff0c;说如何将爬取的数据批量存到数据库中&#xff1f;数据入库也是童鞋们必须掌握的技能&#xff01;数据回来之后&#xff0c;肯定需要存放&#xff0c;实效高、数量少的可能大多存放在cvs文件中&#xff0c;通常情况都是要存放到数据库的&…

[JS入门到进阶] 7条关于 async await 的使用口诀,新学 async await?背10遍,以后要考!快收藏

我是HullQin&#xff0c;公众号线下聚会游戏的作者&#xff08;欢迎关注公众号&#xff0c;发送加微信&#xff0c;交个朋友&#xff09;&#xff0c;转发本文前需获得作者HullQin授权。我独立开发了《联机桌游合集》&#xff0c;是个网页&#xff0c;可以很方便的跟朋友联机玩…

蓝牙音响插着电源线就会一直有电流声怎么回事呢 All In One

蓝牙音响插着电源线就会一直有电流声怎么回事呢 All In One蓝牙音响插着电源线就会一直有电流声怎么回事呢 All In One周围存在电源的电磁干扰 ✅之前使用 USB 集线器的旁边上有一个电源插板,估计是收到了电磁干扰了 ❌直接使用电脑自带的 USB 接口连接即可 🚀refs https://…

软件测试概念总结

软件测试1.软件测试&#xff1a;2.软件测试的特点&#xff1a;3.软件测试和开发的区别&#xff1a;4.软件测试与调试的区别&#xff1a;5.优秀的软件测试人员具备的素质6.核心竞争力7.学习方法8.学习内容9.需求的概念10.用户需求11.软件需求12.生成测试用例的过程13.为什么需求…

GO语言自学_001_环境配置_windowx11_x64版本

GO语言自学_001_环境配置_windowx11_x64版本下载地址: https://golang.google.cn/ 1、看到那个下载按钮了么?点她!2、点击download到这个页面,根据电脑自身系统配置下载包。3、下载完毕后,运行.msi文件,一路next就可以了。本人电脑默认下载到C:\Program Files\Go路径。需要…

创建员工表格,遍历数组获取每个员工,并且渲染到表格中

首先是CSS部分,根据需求添加属性,可以调整 再是盒子部分 接下来是js部分:重点就是JS部分,利用遍历数组获取每个员工,再进行渲染,注意for下面的console.log( ` 这里面有一个标点符号千万别忘记(叫反引号 是 Shrit +ESC下面这个键) ` ) 实际效果图

计算机毕业设计springboot+vue基本微信小程序的外卖点餐订餐平台

项目介绍 餐饮行业是一个传统的行业。根据当前发展现状&#xff0c;网络信息时代的全面普及&#xff0c;餐饮行业也在发生着变化&#xff0c;单就点餐这一方面&#xff0c;利用手机点单正在逐步进入人们的生活。传统的点餐方式&#xff0c;不仅会耗费大量的人力、时间&#xf…

SAP云集成 SAP Integration Suite启用过程,踩坑记

第一步 &#xff1a;创建一个 subscription I现在访问&#xff0c;会提示unauthorized&#xff0c;无权访问 配置了这个&#xff0c;还是无法访问 CPI界面 最后在CPI 官方文档中看到这么一段&#xff0c;tricky&#xff0c;清除浏览器缓存和cookie 然后进来了。。。 第二步&am…

[Latex] \bibitem{} | .bbl 格式参考文献转换与获得

BibTex格式&#xff0c;在dblp或者谷歌学术等都可直接获得&#xff0c;但是\bibitem{}无法直接获得&#xff0c;因此需要通过BibTex格式进行转换。 BibTeX格式参考文献&#xff1a; \bibitem{}格式参考文献&#xff1a; 将BibTeX格式转为\bibitem{}格式 准备好2个文件&…

【Word】如何批量导出ppt中的备注

【Word】如何批量导出ppt中的备注文件 | 导出 | 创建讲义 | 备注在幻灯片旁在word中删除左边两列,复制剩下的表格 | 粘贴-只保留文本

解决 Element的el-input 密码输入框浏览器自动填充账号密码问题

问题描述 通常情况下&#xff0c;浏览器会默认将已保存的账号密码 填充到 input type 值为password的输入框内&#xff0c;如果在登录页面&#xff0c;这当然是非常好的&#xff0c;自动填充密码可以节约时间&#xff0c;提高良好的使用体验&#xff0c;这样当然是没有什么问…

Spring Cloud Gateway 网关整合 Knife4j

文章目录1&#xff1a;环境准备2&#xff1a;gateway服务设置1&#xff1a;导包2&#xff1a;yml配置3&#xff1a;添加配置类&#xff0c;从网关服务中获取服务列表4&#xff1a;重写并覆盖/swagger-resources接口3&#xff1a;其他业务逻辑服务设置1&#xff1a;其他服务导包…

【Unity面试】 Unity基础核心 | 面试真题 | 全面总结 | 建议收藏

你知道的越多&#xff0c;你不知道的越多 &#x1f1e8;&#x1f1f3;&#x1f1e8;&#x1f1f3;&#x1f1e8;&#x1f1f3; 点赞再看&#xff0c;养成习惯&#xff0c;别忘了一键三连哦 &#x1f44d;&#x1f44d;&#x1f44d; 文章持续更新中 &#x1f4dd;&#x1f4dd;…

springboot项目如何打包成.sh脚本形式运行|assemly插件打包自定义脚本参数

0. 引言 springboot作为目前主流的java开发框架&#xff0c;因为便捷和易上手的特性&#xff0c;深受开发者欢迎。springboot默认以jar包形式&#xff0c;通过java -jar指令运行 但这样的启动方式实际上不是很友好&#xff0c;我们常常看到各类组建通过bin目录下的start.sh脚…

阿里、腾讯、百度大厂的程序员编程指南规范

众所周知&#xff0c;现在软件行业不仅要求功能完成&#xff0c;对代码规范也是要求非常高的。一个编程规范不仅是代码美观、易读&#xff0c;在调试bug、程序安全等方面都是有影响的。比如&#xff1a;代码中的魔法数字&#xff0c;要求提取枚举、SQL语句要求不能采用拼接方式…

我开发了一个下载器 带宽拉满

大家好&#xff0c;我是 jonssonyan&#xff0c;一个痴迷软件技术的人。今天和大家分享一个我之前开发的 PC 端下载器。 准确的说是一款基于 AriaNg 和 Aria2 的 PC 端下载器。目前只支持 Windows 平台&#xff0c;我给它取名叫Aria2-X&#xff0c;并且将代码开源在 GitHub 上…

YOLOv7改进之二十五:引入Swin Transformer

​前 言&#xff1a;作为当前先进的深度学习目标检测算法YOLOv7&#xff0c;已经集合了大量的trick&#xff0c;但是还是有提高和改进的空间&#xff0c;针对具体应用场景下的检测难点&#xff0c;可以不同的改进方法。此后的系列文章&#xff0c;将重点对YOLOv7的如何改进进行…

终于拿到了爆火全网的进一线大厂程序员必看的1700道java面试题

爆火全网的进一线大厂程序员必看的1700道java面试题到底有多牛&#xff1f; 牛不牛不敢说&#xff0c;但是有好多程序员是靠这一套1700道高频面试题&#xff0c;顺利收到很多大厂offer&#xff01; 以至于&#xff0c;到现在为止&#xff0c;大厂都开始按照这一套1700道面试题…

北京十大靠谱律师事务所排名(口碑榜单)

律师行业很多人并不太了解&#xff0c;其实简单的案件一般不需要律师有丰富的经验积累&#xff0c;因此委托入行不久的年轻律师&#xff0c;他们能花更多时间去帮你处理&#xff0c;态度好&#xff0c;更重要的是收费低。 复杂的或者涉及金额特别大的案子委托资深律师。当然不是…