[TOC]
# 一切皆可自定义
![](https://img.kancloud.cn/3e/70/3e70a67b52715063a543c310e3d1bca5_459x435.jpg)
**产品需求:** 当用户发送的消息内容包含敏感词时,需要做发送失败处理,对方无法接收到消息,但需要展示在聊天列表,点击红色感叹号提示发送失败。
**解决方案:** 由于使用的是环信SDK,一开始想的解决方案有:a,在消息发送前设置消息状态(无效);b,设置消息接收人为空(iOS有效,Android无效);c,手动写入消息到本地消息数据库(消息UI无法控制);d,数据库取回消息后,展示前插入敏感词消息(实现复杂,需要自己维护敏感词消息)。最终的解决方案:考虑到我们之前有使用自定义消息,采用自定义消息的形式,但是将自定义消息的UI做成普通的消息UI即可,点按发送消息按钮时,直接调用存储消息接口。
# 数据类型引发的bug
**问题:** rap上录入的接口直接转换为Java bean,但是实际后台接口返回的数据类型不匹配,易造成显示问题
# ListView视图类型的复用问题
**问题:** IM聊天界面新增了一种视图类型,但是由于之前代码使用ListView实现,且业务逻辑异常混乱错杂,上线后出现View复用时出现异常,在需要紧急修复bug的情况下,进行代码重构太过耗时。
**解决方案:** 新增的视图类型与原有的相似类型进行布局共用,根据itemViewType来控制布局内容的具体展示。当然这只是在时间紧急情况下的一种解决临时方案,还是应找出View复用异常的原因并处理。
# 运行时权限问题
**问题:** 工信部返回的问题是应用内部频繁请求定位权限,初期无法重现
**解决方案:** 经排查,由于原先只适配6.0以下版本系统,未加入动态申请权限代码。后期加入动态申请代码时,未添加完整,导致多处未动态申请权限,直接调用了定位的相关代码。造成用户在使用时没看到在申请定位权限,但其实应用一直在进行定位。
# 布局文件中控件id重复问题
**问题:**在Java代码中根据id获取控件并设置文本,文本不显示。debug发现TextView并不为空,要设置的目标文本也不为空。直接将TextView内容写死可以显示,因此字体颜色这些并无问题。
**解决方案**经仔细查看布局文件,布局文件中使用include标签引入其他布局,其他布局中存在和当前布局中id名相同的空间。但由于没在一个布局文件中,Android Studio并不会报错,因此在设置文本的时候设置的都是其他布局中的TextView。恰巧其他布局在一开始又是隐藏不显示的,造成更改当前布局中控件无效的假象。
# LinearLayout方向问题要注意
记得设置LinearLayout的排列方向
- 导读
- Java知识
- Java基本程序设计结构
- 【基础知识】Java基础
- 【源码分析】Okio
- 【源码分析】深入理解i++和++i
- 【专题分析】JVM与GC
- 【面试清单】Java基本程序设计结构
- 对象与类
- 【基础知识】对象与类
- 【专题分析】Java类加载过程
- 【面试清单】对象与类
- 泛型
- 【基础知识】泛型
- 【面试清单】泛型
- 集合
- 【基础知识】集合
- 【源码分析】SparseArray
- 【面试清单】集合
- 多线程
- 【基础知识】多线程
- 【源码分析】ThreadPoolExecutor源码分析
- 【专题分析】volatile关键字
- 【面试清单】多线程
- Java新特性
- 【专题分析】Lambda表达式
- 【专题分析】注解
- 【面试清单】Java新特性
- Effective Java笔记
- Android知识
- Activity
- 【基础知识】Activity
- 【专题分析】运行时权限
- 【专题分析】使用Intent打开三方应用
- 【源码分析】Activity的工作过程
- 【面试清单】Activity
- 架构组件
- 【专题分析】MVC、MVP与MVVM
- 【专题分析】数据绑定
- 【面试清单】架构组件
- 界面
- 【专题分析】自定义View
- 【专题分析】ImageView的ScaleType属性
- 【专题分析】ConstraintLayout 使用
- 【专题分析】搞懂点九图
- 【专题分析】Adapter
- 【源码分析】LayoutInflater
- 【源码分析】ViewStub
- 【源码分析】View三大流程
- 【源码分析】触摸事件分发机制
- 【源码分析】按键事件分发机制
- 【源码分析】Android窗口机制
- 【面试清单】界面
- 动画和过渡
- 【基础知识】动画和过渡
- 【面试清单】动画和过渡
- 图片和图形
- 【专题分析】图片加载
- 【面试清单】图片和图形
- 后台任务
- 应用数据和文件
- 基于网络的内容
- 多线程与多进程
- 【基础知识】多线程与多进程
- 【源码分析】Handler
- 【源码分析】AsyncTask
- 【专题分析】Service
- 【源码分析】Parcelable
- 【专题分析】Binder
- 【源码分析】Messenger
- 【面试清单】多线程与多进程
- 应用优化
- 【专题分析】布局优化
- 【专题分析】绘制优化
- 【专题分析】内存优化
- 【专题分析】启动优化
- 【专题分析】电池优化
- 【专题分析】包大小优化
- 【面试清单】应用优化
- Android新特性
- 【专题分析】状态栏、ActionBar和导航栏
- 【专题分析】应用图标、通知栏适配
- 【专题分析】Android新版本重要变更
- 【专题分析】唯一标识符的最佳做法
- 开源库源码分析
- 【源码分析】BaseRecyclerViewAdapterHelper
- 【源码分析】ButterKnife
- 【源码分析】Dagger2
- 【源码分析】EventBus3(一)
- 【源码分析】EventBus3(二)
- 【源码分析】Glide
- 【源码分析】OkHttp
- 【源码分析】Retrofit
- 其他知识
- Flutter
- 原生开发与跨平台开发
- 整体归纳
- 状态及状态管理
- 零碎知识点
- 添加Flutter到现有应用
- Git知识
- Git命令
- .gitignore文件
- 设计模式
- 创建型模式
- 结构型模式
- 行为型模式
- RxJava
- 基础
- Linux知识
- 环境变量
- Linux命令
- ADB命令
- 算法
- 常见数据结构及实现
- 数组
- 排序算法
- 链表
- 二叉树
- 栈和队列
- 算法时间复杂度
- 常见算法思想
- 其他技术
- 正则表达式
- 编码格式
- HTTP与HTTPS
- 【面试清单】其他知识
- 开发归纳
- Android零碎问题
- 其他零碎问题
- 开发思路