做Android客户端一个半月的一点想法

2024-05-04 00:08

本文主要是介绍做Android客户端一个半月的一点想法,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

想来离开上海才两个星期了,离开ODM公司也已经差两天3个月了,我很庆幸,自己走出泥潭,虽然也经历了40天的无业期,但总归结果是好的。

人啊,一旦有了点目标,还真是一往直前,自己都想不出自己哪里来的动力,明明都环境都已经很恶劣了,形势也很严峻了。

从Framework到Application,我真心建议应届毕业生先选择后者,不是说Framework不好,但总归没那么多地方能让你施展拳脚的。


接触上层的框架,是从找工作中期开始的,可能也是因为Android基础过了关,走到了二面上去,面试官问的这方面也多了起来,不会那就去看嘛,看会了再去下一家面,当时我是抱着这种心态的,所以面试官提出的框架,不管有的没的,我回去都会撸上个几个小时,从使用到实现,管他看不看得懂,先吞它一遍...哈哈哈奋斗


17年12月19号,我在一家做金融的APP公司入职了,首先肯定是撸他们的代码嘛,都有什么模块,什么业务逻辑,怎么实现的,接口回调,数据解析啥的,说真的,我由于以前没有做过这些(大学也没好好做项目)看起来那是一个懵啊,整天的状态就是,这是啥啊,咋回事,因为啥啊...大哭

持续了一个多星期吧,就没有这么纠结了,微笑因为老大给我了一个需求,让我实现一个二级界面,EXO???我连看都看不懂,直接让我去实现,好吧,毕竟给了我工资,我也不好说什么...开整吧,后台给了我三个接口文档,我内二级界面里面需要用的;UI给了我几张图(标记好了像素点的),我内二级界面需要实现的。 


就这么些东西,看了一会,先用postman试了试接口(我怕后台框我,哈哈哈),然后自己写了个小Demo,先把界面画出来(逻辑啥的后面再说呗),撸接口好说,调调参数就ok了。mmp,那个界面,弟弟我写了几天吧...RecycleView的嵌套,Indicator的款式,还有杂七杂八的一些小布局,总之这是我做App的第一个布局嘛,肯定会遇到各种麻烦的,我一直坚信所有的坑自己都踩了一遍,对自己提升才会大,不然总是听别人说,有什么意思(我是不是受虐狂...)。


这些搞好了以后,我就开始加血加肉了(mmp这是我犯得的第一个错,导致后来自己重构累吐血),完全面向过程式编程,你们都懂的,就是那种专门为了实现功能写的代码,惨目忍睹,不能给别人看的。但是讲道理我还是用了Retrofit和RxJava的,毕竟第一个星期看人家写的代码都是用这些的,我不用也不好意思啊。

写接口,实现类,写Adapter,写Holder,总之磨磨蹭蹭终于把这个东西实现了,但还是有很多细节问题,例如当时我用的一个接口是实时更新数据,我当时的做法是拿到数据后,和本地数据对比,然后填充,刷新整个RecycleView,后面再说这个坑(自己给自己挖坑)。还有问题就是无网络或者接口出现异常时的处理,这些我第一次写的时候都没有考虑到(也是自己一手一手写出的坑),还有为了实现一个吸顶的功能,各种算啊,算ActionBar高度,算状态栏高度,mmp最后还是怎么算都不对,然后可下算对了,展示时候还出错了(这个我提示一下,我大布局用的Linearlayout,然后当Y坐标走到这个地方的时候,把之前藏好的一模一样的Title展示出来,你们猜会出现什么问题)还有为了实现多种Type的view,写了几个模板,哇撒,写Adapter时候没把我自己难受死(坑多的不行,当时还不知道什么是floating这种东西)。

debug自己的代码差不多2天吧,终于把写好了,然后我老大看了代码以后一脸懵B(可能就像我第一周看他们的代码时一个感觉吧微笑),接下来我就有事做了,把自己的改成MVP架构。呵呵哒,我当时恬不知耻的问了下MVP模式该怎么写...虽然看过,但是看过和你用过是不一样的,所以我还是问了。大佬也是仁慈,给我讲了半个小时吧,我就开始了-----我的重构之旅!


重构之前,我先说一下我自己写的那些BUG吧微笑,首先是刷新整个RecycleView,由于刷新的速度过快,又是整个刷新,导致用户的点击事件会被吃掉,当页面刷新时用户点击,没有进行跳转,总之就是没有响应用户的操作吧,解决这个我就是重新写了下逻辑,让其只刷新其中一个Item中的展示数据的View。(这里面有个问题我顺便提一下,关于刷新RecycleView的,你直接notifyDataSetChanged 或者notifyItemChanged(int)是没有用的!!!想知道为什么嘛?

嘻嘻嘻,我就简单说一下:网上博客一大堆你们也可以找,有人会说,我用怎么就没有这个问题呢,emmm我觉得应该是你项目的代码里面哪里的进行第二次请求,导致调用到了onBindViewHolder,因为你看源码就知道notify的时候是没有调用onBindViewHolder,所以你的View根本就不会重新绘制!想让他刷新的话,下面我给两个方案吧:

1.adapter.notifyItemInserted();

   adapter.notifyItemChanged();

   adapter.notifyItemMoved();

   adapter.notifyItemRemoved();

   adapter.notifyItemRangeChanged();

   adapter.notifyItemRangeInserted();

   adapter.notifyItemRangeRemoved();

你这样通知一下,才行.... 或者你觉得太麻烦了你可以这样notifyItemInserted(getItemCount());,但是这样就是末尾更新,你懂我意思吧。嗯 ,你懂得

2.重写notifyItemChanged(),让其去调用onBindViewHolder,这种不怎么推荐,因为其没有刷新的根本原因不在这个方面里面,这样写不知道会不会有别的问题...

关于RecycleView我就说这些吧(emmm,我实在忍不住,再说最后一个点吧,刷新单个item的时候会出现闪烁问题,我写的代码真的出现这个问题了,我的解决办法是,把RecycleView自带的动画屏蔽掉了,简单粗暴,但是你要是对动画有要求就只能另寻他路了,直接上代码:((SimpleItemAnimator)recyclerView.getItemAnimator()).setSupportsChangeAnimations(false); //嗯,就这一行,哈哈哈,多了我也不能写啊,最好的程序员知道什么状态么,就是不写代码,最好还能删一些。 你们懂我意思吗,我猜你懂。


再说一下吸顶的坑,因为我用的是LinearLayout,所以在一个View从GONE到VISIBLE的时候,要重新布局,就会闪烁一下,把LinearLayout改成Framelayout或者ConstraintLayout(新的布局,推荐大家去看一下,毕竟要跟的上技术更新的速度嘛)


重构之路:

将自己写的渣渣代码,改成MVP模式,首先呢要明确 P是干什么的,简单一句话概括,全是Java,没有Android!

你们懂我意思么...emmm,过程数据的处理,接口的调用等等再P中进行,但是他会持有一个View的对象,这样可以在数据处理完毕之后通知View去更新,这回懂了吧!!!

然后说一下接口的事情,后台给你的接口,有很多时候是需要并发使用的,也就是说,你的动作要在这两个接口都调用结束后再进行,那么就要用异步,最开始我自己写了个Sync锁(mmp后面才知道RxJava的flatMap可以帮你处理这种事情)

重构之路很漫长,我把这个模块重构好了以后,1月底(27号)我就离开上海了,到了北京,北京的故事后面再说吧,今天有点累了...(剧透一下,看了新公司的代码,我才觉得一句话是至理名言:任何一个傻瓜都能写出计算机可以理解的代码,唯有写出人类容易理解的程序才是一个好程序员)下次我会写一写,代码重构里面的模块组件化这些。

这篇关于做Android客户端一个半月的一点想法的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/957951

相关文章

MYSQL查询结果实现发送给客户端

《MYSQL查询结果实现发送给客户端》:本文主要介绍MYSQL查询结果实现发送给客户端方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录mysql取数据和发数据的流程(边读边发)Sending to clientSending DataLRU(Least Rec

Python FastMCP构建MCP服务端与客户端的详细步骤

《PythonFastMCP构建MCP服务端与客户端的详细步骤》MCP(Multi-ClientProtocol)是一种用于构建可扩展服务的通信协议框架,本文将使用FastMCP搭建一个支持St... 目录简介环境准备服务端实现(server.py)客户端实现(client.py)运行效果扩展方向常见问题结

Android学习总结之Java和kotlin区别超详细分析

《Android学习总结之Java和kotlin区别超详细分析》Java和Kotlin都是用于Android开发的编程语言,它们各自具有独特的特点和优势,:本文主要介绍Android学习总结之Ja... 目录一、空安全机制真题 1:Kotlin 如何解决 Java 的 NullPointerExceptio

C#使用MQTTnet实现服务端与客户端的通讯的示例

《C#使用MQTTnet实现服务端与客户端的通讯的示例》本文主要介绍了C#使用MQTTnet实现服务端与客户端的通讯的示例,包括协议特性、连接管理、QoS机制和安全策略,具有一定的参考价值,感兴趣的可... 目录一、MQTT 协议简介二、MQTT 协议核心特性三、MQTTNET 库的核心功能四、服务端(BR

SpringBoot快速搭建TCP服务端和客户端全过程

《SpringBoot快速搭建TCP服务端和客户端全过程》:本文主要介绍SpringBoot快速搭建TCP服务端和客户端全过程,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,... 目录TCPServerTCPClient总结由于工作需要,研究了SpringBoot搭建TCP通信的过程

Android NDK版本迭代与FFmpeg交叉编译完全指南

《AndroidNDK版本迭代与FFmpeg交叉编译完全指南》在Android开发中,使用NDK进行原生代码开发是一项常见需求,特别是当我们需要集成FFmpeg这样的多媒体处理库时,本文将深入分析A... 目录一、android NDK版本迭代分界线二、FFmpeg交叉编译关键注意事项三、完整编译脚本示例四

Android与iOS设备MAC地址生成原理及Java实现详解

《Android与iOS设备MAC地址生成原理及Java实现详解》在无线网络通信中,MAC(MediaAccessControl)地址是设备的唯一网络标识符,本文主要介绍了Android与iOS设备M... 目录引言1. MAC地址基础1.1 MAC地址的组成1.2 MAC地址的分类2. android与I

Android 实现一个隐私弹窗功能

《Android实现一个隐私弹窗功能》:本文主要介绍Android实现一个隐私弹窗功能,本文通过实例代码给大家介绍的非常详细,感兴趣的朋友一起看看吧... 效果图如下:1. 设置同意、退出、点击用户协议、点击隐私协议的函数参数2. 《用户协议》、《隐私政策》设置成可点击的,且颜色要区分出来res/l

Android实现一键录屏功能(附源码)

《Android实现一键录屏功能(附源码)》在Android5.0及以上版本,系统提供了MediaProjectionAPI,允许应用在用户授权下录制屏幕内容并输出到视频文件,所以本文将基于此实现一个... 目录一、项目介绍二、相关技术与原理三、系统权限与用户授权四、项目架构与流程五、环境配置与依赖六、完整

Android 12解决push framework.jar无法开机的方法小结

《Android12解决pushframework.jar无法开机的方法小结》:本文主要介绍在Android12中解决pushframework.jar无法开机的方法,包括编译指令、框架层和s... 目录1. android 编译指令1.1 framework层的编译指令1.2 替换framework.ja