做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

相关文章

Android开发中gradle下载缓慢的问题级解决方法

《Android开发中gradle下载缓慢的问题级解决方法》本文介绍了解决Android开发中Gradle下载缓慢问题的几种方法,本文给大家介绍的非常详细,感兴趣的朋友跟随小编一起看看吧... 目录一、网络环境优化二、Gradle版本与配置优化三、其他优化措施针对android开发中Gradle下载缓慢的问

Android 悬浮窗开发示例((动态权限请求 | 前台服务和通知 | 悬浮窗创建 )

《Android悬浮窗开发示例((动态权限请求|前台服务和通知|悬浮窗创建)》本文介绍了Android悬浮窗的实现效果,包括动态权限请求、前台服务和通知的使用,悬浮窗权限需要动态申请并引导... 目录一、悬浮窗 动态权限请求1、动态请求权限2、悬浮窗权限说明3、检查动态权限4、申请动态权限5、权限设置完毕后

Android里面的Service种类以及启动方式

《Android里面的Service种类以及启动方式》Android中的Service分为前台服务和后台服务,前台服务需要亮身份牌并显示通知,后台服务则有启动方式选择,包括startService和b... 目录一句话总结:一、Service 的两种类型:1. 前台服务(必须亮身份牌)2. 后台服务(偷偷干

使用Java实现获取客户端IP地址

《使用Java实现获取客户端IP地址》这篇文章主要为大家详细介绍了如何使用Java实现获取客户端IP地址,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 首先是获取 IP,直接上代码import org.springframework.web.context.request.Requ

Android kotlin语言实现删除文件的解决方案

《Androidkotlin语言实现删除文件的解决方案》:本文主要介绍Androidkotlin语言实现删除文件的解决方案,在项目开发过程中,尤其是需要跨平台协作的项目,那么删除用户指定的文件的... 目录一、前言二、适用环境三、模板内容1.权限申请2.Activity中的模板一、前言在项目开发过程中,尤

Python手搓邮件发送客户端

《Python手搓邮件发送客户端》这篇文章主要为大家详细介绍了如何使用Python手搓邮件发送客户端,支持发送邮件,附件,定时发送以及个性化邮件正文,感兴趣的可以了解下... 目录1. 简介2.主要功能2.1.邮件发送功能2.2.个性签名功能2.3.定时发送功能2. 4.附件管理2.5.配置加载功能2.6.

Redis连接失败:客户端IP不在白名单中的问题分析与解决方案

《Redis连接失败:客户端IP不在白名单中的问题分析与解决方案》在现代分布式系统中,Redis作为一种高性能的内存数据库,被广泛应用于缓存、消息队列、会话存储等场景,然而,在实际使用过程中,我们可能... 目录一、问题背景二、错误分析1. 错误信息解读2. 根本原因三、解决方案1. 将客户端IP添加到Re

Android数据库Room的实际使用过程总结

《Android数据库Room的实际使用过程总结》这篇文章主要给大家介绍了关于Android数据库Room的实际使用过程,详细介绍了如何创建实体类、数据访问对象(DAO)和数据库抽象类,需要的朋友可以... 目录前言一、Room的基本使用1.项目配置2.创建实体类(Entity)3.创建数据访问对象(DAO

SpringBoot实现websocket服务端及客户端的详细过程

《SpringBoot实现websocket服务端及客户端的详细过程》文章介绍了WebSocket通信过程、服务端和客户端的实现,以及可能遇到的问题及解决方案,感兴趣的朋友一起看看吧... 目录一、WebSocket通信过程二、服务端实现1.pom文件添加依赖2.启用Springboot对WebSocket

QT实现TCP客户端自动连接

《QT实现TCP客户端自动连接》这篇文章主要为大家详细介绍了QT中一个TCP客户端自动连接的测试模型,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录版本 1:没有取消按钮 测试效果测试代码版本 2:有取消按钮测试效果测试代码版本 1:没有取消按钮 测试效果缺陷:无法手动停