实践介绍
1.1 项目核心信息
本项目实现影视综艺节目列表及其历史数据查询,实现个人页面显示、个人页面粉丝和关注者列表、个人页面发布视频列表及其详情页。
1.2 项目服务地址
1.3GitHub地址
二、分工
团队成员主要贡献 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 只需要关心自己的业务逻辑,而不用关心数据的具体来源。当数据发生变化时,可以自动通知和更新接口,数据模型驱动接口更新。
下面是影视综艺节目单的代码示例
-
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);
}
}
});
复制代码 -
RankViewModel持有rankRepository,通过rankRepository获取列表数据。
公共实时数据<List<RankItem.DataBean.ListBean> > getRankItemByTypeAndVersion(字符串类型,字符串版本){
返回 rankRepository.getRankItemByTypeAndVersion(type,version);
}
复制代码 -
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));
}
}
});
}
复制代码 -
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
- 模型
- 网络:ApiService 接口和 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