Android开发经验
山水相逢-z
这个作者很懒,什么都没留下…
展开
-
OkHttp内部流程解析
最近在看okhttp源码,这个流程度总结的很棒,记录一下~原创 2020-12-14 16:19:30 · 218 阅读 · 0 评论 -
一个小插件,根据注解自动生成说明文档
一、背景我们app里有很多事件埋点,pm经常会来问某个操作埋点了吗,埋点值是啥啊,经常会需要在代码里找,虽然我们有自己的埋点录入平台,但是需要手动输入,为了提高效率,写了一个小插件,用自定义注解的形式,在build的时候,自动将被注解的埋点统一输出到一个文档里,方便查找。目前功能比较简单,只能固定路径生成txt文档,后续会支持更多功能。二、原理主要是自定义注解处理器来实现的,学习了这篇文章三、用途:用注解标注需要说明的变量,编译后自动在当前项目根目录生成文档。四、使用方法添加依赖在ap原创 2020-07-17 18:11:27 · 392 阅读 · 0 评论 -
MVP简记
大多数开发场景的套路都是这样:用户通过ui界面触发某个操作,从本地或者网络获取数据之后再在界面上展示出来,如果逻辑比较复杂,那么获取数据这步代码可能就会比较多,如果全部写在Activity或者Fragment中,就会显得很臃肿。在MVP这种开发模式中,可以将代码分为三个角色:Model,View,Presenter:Model 理解为对应数据层,将大部分的业务逻辑层放在这里。Vie...原创 2018-07-20 15:05:55 · 156 阅读 · 0 评论 -
Android 8.0系统上使用WindowManager添加view的一个问题
如图,app有个功能,用户设置一个定时,到时后会弹窗提示。实现很简单,注册SYSTEM_ALERT_WINDOW权限,使用WindowManager对象调用addView(view, para)添加view即可。WindowManager wm = (WindowManager) context.getApplicationContext().getSystemService(Context.WIN原创 2017-12-20 15:06:14 · 8174 阅读 · 1 评论 -
从源码梳理Retrofit网络请求过程
通过定义一个接口,在方法上加入相关注解,Retrofit框架就可以把它解析成对应的网络请求,使用非常方便,记录下从源码角度看这个过程是怎么实现的。一 Retrofit的引入在Android Studio中引入Retrofit非常方便,目标最新版本是2.3,在app-build文件-dependencies节点下加入以下依赖即可: compile 'com.squareup.retrofit2:原创 2017-12-03 13:49:08 · 247 阅读 · 0 评论 -
升级Android支持库版本遇到的两个问题
公司项目之前support Library 版本比较混乱,各moudle有好几个版本的v7包和v4包,而且版本还比较低,今天抽时间统一了下支持库以及buildToolsVersion等的版本,但是遇到了两个问题,记录一下。1. 升级buildToolsVersion至26最新的buildToolsVersion已经到26了,照之前方式,直接在build文件中将buildToolsVersion后的引原创 2017-10-16 18:11:15 · 375 阅读 · 0 评论 -
es6中箭头函数学习的一个记录
公司要开小程序的项目了,领导让提前熟悉下es6的语法,学习中遇到箭头函数相关的一段代码,起初对输出结果不是很理解,重新看了箭头函数的相关概念后才有一点儿明白。如下代码:function Timer() { this.s1 = 0; this.s2 = 0; // 箭头函数 setInterval(() => this.s1++, 1000); // 普通函数 setInter原创 2017-07-06 18:07:55 · 445 阅读 · 0 评论 -
集成butterknife最新版本8.6.0
最近刚完成一个版本的需求,有空闲时间,准备好好整理下手上的项目。因为公司项目开始的时间比较早,很多新的开源框架都没用上(新开的项目用到了),开发效率有时候确实比较低,所以打算逐步为手上的老项目引进一些成熟的框架,来提升开发效率(当然也想偷个懒,目前我一个人负责android项目,开发效率高了我也就不用加班了哈哈)。首先要摆脱的就是无穷无尽的findViewById了,解决方案有很多,最终选择了著名的原创 2017-07-05 17:28:42 · 749 阅读 · 0 评论 -
webview调用android代码
在开发的时候经常会用到webview,必然会涉及到webview与客户端的交互,比如在网页上进行某个操作后,需要在app上显示一个提示,提示内容由网页提供,这时候就需要js来调用客户端的java代码了。webview提供了一个方法addJavascriptInterface()来满足这种需求。具体步骤:1.客户端定义一个类,并定义需要的方法,例如:public class WebAppInterfa原创 2017-05-26 11:39:17 · 299 阅读 · 0 评论 -
ExpandableStickyListHeadersListView遇到的一个问题
最近一直忙着版本更新,记录一下中间遇到的一些问题。ExpandableStickyListHeadersListView这个开源库主要是实现列表分组的,常见的需求用它还是不错的,项目中也有用到这个控件,一直没有什么问题,但是,这期需求测试在用华为nexus p6做测试的时候,发现了一个奇怪的问题:在列表快速滑动的时候,点击返回键离开当前界面,app会崩溃,崩溃日志如下:Attempt to invo原创 2017-05-26 11:35:56 · 696 阅读 · 0 评论 -
java.lang.OutOfMemoryError: unable to create new native thread
最新项目有版本更新,在打渠道包的时候老是刚打了一两个包的时候,就会抛出一个异常,导致打包失败:java.lang.OutOfMemoryError: unable to create new native thread由字面意思也可以知道是内存溢出了,在网上查了一下,说是创建了太多的线程。但是同样环境下,我们另外一个项目用相同的方式打包就没有出现这个问题,而且另外一个项目比出现问题的项目还要复杂一原创 2017-05-26 11:35:30 · 481 阅读 · 0 评论 -
Android Studio3.0多渠道打包遇到的问题
最近升级到了Android Studio3.0,在给测试打包的时候突然出错,错误如下:Error:Cannot choose between the following configurations of project :UMUpdate: - debugApiElements - debugRuntimeElements - releaseApiElements原创 2017-12-12 13:20:55 · 1039 阅读 · 0 评论 -
ScrollView里面基于某个View弹出PopupWindow,PopupWindow不会跟着View滚动?
遇到这样一个需求:根布局为ScrollView,内部有一个TextView,叫它A,需要在A正上方弹出一个PopupWindow。 初看其实很简单,根据A的位置和大小,算出PopupWindow的位置,调用showAtLocation方法即可实现在A正上方弹出。 代码如下:showPopAlongView(textView);private void showPopAlongVie...原创 2018-06-29 09:58:07 · 1994 阅读 · 0 评论 -
Android进程间通信机制Binder学习
Android 系统是基于 Linux 内核的,Linux 已经提供了管道、消息队列、共享内存和 Socket 等 IPC (跨进城通信)机制。但是由于性能、稳定性和安全性几方面的原因,Android系统设计了Binder机制来实现IPC.性能稳定Binder 基于 C/S 架构,客户端(Client)有什么需求就丢给服务端(Server)去完成,架构清晰、职责明确又相互独立,自然...原创 2019-02-17 13:23:12 · 247 阅读 · 0 评论 -
AsyncTask执行流程总览
用户调用task.execute() =>onPreExecute()=>交给线程池sDefaultExecutor调度=>mFuture 配合 mWorker开启子线程=>doInBackground()=>交给内部单例InternalHandler处理返回结果并返回到主线程=>根据Message处理onProgressUpdate()或onPos...原创 2018-12-24 17:45:45 · 216 阅读 · 0 评论 -
正确的“懒汉式”单例写法
public class Singleton { private volatile static Singleton INSTANCE; //声明成 volatile private Singleton (){} public static Singleton getSingleton() { if (INSTANCE == null) { ...原创 2018-09-26 18:15:44 · 571 阅读 · 1 评论 -
Android基础知识-布局优化
在Android中界面绘制是比较费时的,尤其是嵌套比较复杂的界面,所以我们会用一些技巧来优化布局。Android提供了以下标签或控件来供我们优化布局:1.<include>这个标签允许我们在当前布局文件中,引用另一个布局文件。最常见的一个例子就是页面头布局,我们经常会封装一个统一样式的布局(比如包含标题,以及左右操作按钮等),然后在需要的界面,使用&am原创 2018-09-19 15:34:32 · 256 阅读 · 0 评论 -
一步一步实现Android低功耗蓝牙(BLE)基本开发
项目需要接入两个低功耗蓝牙设备(BLE),并且与之交互(读/写)数据,所以看了下官方对于这块儿的介绍,总结了一下ble开发中一些需要注意的地方以及基本流程。 BLE开发需要Android 4.3 (API level 18) 及以上一.添加权限 为了能正常使用蓝牙相关功能(扫描等),首先需要添加以下权限:<uses-permission android:name="and...原创 2018-09-13 18:29:10 · 3833 阅读 · 3 评论 -
Android Studio 启用lambda表达式
AS version:3.1.3 在对应moudle的build文件中android 节点下添加以下代码即可启用:compileOptions { sourceCompatibility 1.8 targetCompatibility 1.8 }原创 2018-09-13 16:21:12 · 257 阅读 · 0 评论 -
Android自定义View-记录一个简单却又常见的效果实现
上周遇到一个需求,用一个圆形进度条的形式来展示某项操作所占的比例,虽然类似的轮子已经有很多了,但是这种简单的自定义View个人觉得有时间的话,还是自己写写比较好。首先来看一下效果图: 分析: 从效果图可以看到,这个效果整体分为以下几部分:背景圆环进度圆弧终点小圆圈(进度为0和进度为100%的时候应当没有)内部三行文字怎么实现: 分析出整体框架之后,思路其实已...原创 2018-09-01 12:32:12 · 5401 阅读 · 2 评论 -
Volley从源码梳理主要工作流程
话说Volley这个框架可出来5年了,大佬大佬……1.创建网络请求队列RequestQueue requestQueue=Volley.newRequestQueue(context)2.创建各种类型的请求StringRequest,ImageRequest,JsonRequest,JsonObjectRequest,JsonArrayRequest,...3.将...原创 2018-08-08 15:29:33 · 121 阅读 · 0 评论 -
Butter-Knife使用
早就听过Butter Knife这个神器,公司最近新开了一个项目,用到了这个框架,但也只是简单使用自动绑定控件,昨天抽时间看了下官网,发现这个框架还可以做其他很多的工作,来提高开发效率,总结一下常用用法。一 导入dependencies { compile 'com.jakewharton:butterknife:8.5.1' annotationProcessor 'com.jakewha原创 2017-04-15 11:45:32 · 294 阅读 · 0 评论 -
让你的App有声音
之前写过一篇文章,当时的需求是播放英文,最后使用的是Androi自带的TextToSpeech类来实现(http://blog.csdn.net/weixin_38251977/article/details/69944088),虽然播放英文效果还行,但是对中文的支持不是很好。最近新项目中又遇到一个语音的需求,这次是中英文都有,各种对比之后,选择了百度语音离在线融合SDK,播放效果非常好,关键是免费原创 2017-04-11 14:05:51 · 811 阅读 · 0 评论 -
常用的代码片段,不断更新
为防止更新不及时,github地址如下:https://github.com/SolveBugs/NormalCode1.给当前界面添加一个透明度/** * 给界面添加透明度 * * @param activity * @param bgAlpha */public static void backgroundAlpha(Activity activity, float bgAlp原创 2017-04-10 10:59:11 · 560 阅读 · 0 评论 -
自适应软键盘的Dialog以及监听软键盘弹起
最近项目中遇到一个需求:新手引导。跟一般的新手引导没有什么太大区别,思路都是搞一个带阴影的遮罩层,然后在上边儿给一些提示性的文字,由于需求中有些特殊的地方,所以我用了一个全屏的dialog(而且,dialog自带阴影效果)来做新手引导这个需求。弹出键盘键盘上方具体位置显示引导这个需求中有两个地方需要考虑:1. Dialog的布局要适应软键盘的弹起2. 软键盘弹起和收下的时候都会有不同原创 2017-04-10 10:59:08 · 426 阅读 · 0 评论 -
Python一定要注意大小写
布尔值有两种:True , False原创 2017-04-10 10:59:06 · 3870 阅读 · 0 评论 -
微信小程序学习一初探“小程序”
最近这两天,“微信小程序”这个词占据了朋友圈,大有一番风起云涌之势,当然,还不可能夸张到使原生App开发人员失业这种程度。当然,作为一名技术人员,时刻保持对新技术的好奇心是必须的,所以在网上找大神的教程,搭建了一下开发环境,来学习一下这个新的开发框架。一 项目文件结构当打开微信小程序的Demo的时候,我个人习惯是先看整个项目的文件结构,先大致弄清这部分是干什么的,那部分又是干什么的,微信小程序原创 2017-04-10 10:59:36 · 357 阅读 · 0 评论 -
使用腾讯bugly实现应用自动更新提示
我们都知道,在app开发完成发版的时候,会上传到各个应用市场,来增加用户量,但是这些市场往往会有一个审核的周期,等审核通过之后才会推送给用户来下载,并且,当我们某个版本出现严重bug,或者新增了一个特色功能的时候,我们会希望用户很快就能更新我们最新的app,这时候就要用到 应用检测更新了。 通常,实现应用更新一般我们有两种方法。第一种 自己搭建后台检测是否有更新这种方法通常要求客户端启动后,原创 2017-04-10 10:59:39 · 1715 阅读 · 1 评论 -
最近太忙了
最近公司任务比较多,都没时间写文章了。。。原创 2017-04-10 10:59:42 · 286 阅读 · 0 评论 -
无意间遇到的TextView的一个坑
今天解bug的时候遇到一个奇怪的问题:listview的item由一个textview和一个imageview组成,父布局是线性水平排列。我的本意是imageview显示相同的图片,textview显示文本,但是运行程序后发现,当某个textview的文本较多时,imageview会被压缩,刚开始没注意,检查代码了好久。代码示例如下:<LinearLayout android:id="原创 2017-04-10 10:59:45 · 634 阅读 · 0 评论 -
Android自带类实现语音合成
今天在坑里蹲了半天,然后发现了一个神奇的类上午老大给了一个任务:App原来是中文版的,里边有语音播报功能,最近在搞英文版,所以需要把这个中文的语音播报搞成英文的,由于老大事比较多,所以这个问题就交给我来解决了。其实场景很简单,就是把播报的内容翻译成英文,然后在需要播放的时候让它播放就行.这里用到技术就是传说中的TTS---Text To Speech了。那为什么说我在坑里蹲了半天呢?从这里开始原创 2017-04-10 10:59:48 · 4786 阅读 · 7 评论 -
hellocharts-android-Android图表开源库的使用(一)
最近项目中需要用到图表,技术有限,自己实现起来有难度,于是对比之后,最终决定使用hellocharts这个开源库,传送门:https://github.com/lecho/hellocharts-android ,一是因为引入方便,二是代码也比较清晰,便于加到项目中。还有一个重要的原因,这个库可以支持折线表,柱状表,饼状表以及气泡状表,而且实现的效果非常棒,放几张图大家感受一下:1.gif原创 2017-04-10 10:59:51 · 2356 阅读 · 0 评论 -
自定义view——圆形进度条的实现
最近刚完成一个版本的迭代,所有抽空学习了下自定义view,简单实现了一个可定制的圆形进度条,首先看下效果图:效果.gif下面一步一步来介绍这里我是怎么实现的。首先推荐一篇文章,关于自定义view的“官方套路”,http://blog.csdn.net/yissan/article/details/51136088 写的很好,看完相信大家对于自定义的流程会有一个了解,大神可以略过,跟我一样的原创 2017-04-10 10:59:14 · 496 阅读 · 0 评论 -
一个简单封装好的item
参考微信,简单封装了一个item控件,github地址:https://github.com/SolveBugs 并且昨天折腾了下将库上传到了JCenter远程仓库,方便以后的使用,效果图如下:通用item.png添加依赖在build文件添加依赖:dependencies { compile 'com.zq.commonitemlib:commonitemmoudle:1.0原创 2017-04-10 10:59:16 · 353 阅读 · 0 评论 -
工作中一些细小的经验总结
代码相关字符串,颜色和尺寸等资源尽量在资源文件中定义,以便代码规范和方便修改。方法,变量等命名尽量通俗易懂获取对象的属性的时候在不确定其已经被实例化的情况下一定要做非空判断。按功能模块建包(个人喜欢这样)一个类的代码的行数要控制不要太多,将一些方法可以以工具类的形式抽取。遇到的问题三星等某些手机调用系统摄像机拍照后会把照片旋转。PullToRefreshListView 在最原创 2017-04-10 10:59:19 · 753 阅读 · 0 评论 -
Android USB转串口通信开发基本流程
好久没有写文章了,年前公司新开了一个项目,是和usb转串口通信相关的,需求是用安卓平板通过usb转接后与好几个外设进行通信,一直忙到最近,才慢慢闲下来,趁着这个周末不忙,记录下usb转串口通信开发的基本流程。我们开发使用的是usb主机模式,即:安卓平板作为主机,usb外设作为从机进行数据通信。整个开发流程可以总结为以下几点:1.发现设备UsbManager usbManager = (Usb原创 2017-04-10 10:59:56 · 5264 阅读 · 14 评论 -
自定义View实现水平滚动控件
前几天项目中需要使用到一个水平可滚动的选择条,类似下图效果(图片是从简书上一位作者那儿找来的,本篇也是在这位作者的文章的基础上修改的,站在大神的肩膀上,哈哈,由于原文没有提供demo,而且实现的效果跟我要的不一样(原文不是自定义控件,怎么说自己也是偷懒吧,所以直接封装一下,跟原文代码差别还是很大的),所以进行了一些修改,原文地址:思路来源 )。这个滚动选择条主要基于RecyclerView实现原创 2017-04-10 10:58:57 · 696 阅读 · 0 评论 -
属性动画实现控件类似贝塞尔曲线轨迹移动效果
前段时间工作中需要实现一种控件类似贝塞尔曲线轨迹运动的效果,也是折腾了几天,刚开始本着不重复造轮子的想法,去网上搜类似的效果,结果没搜到,后来自己实现了,抽成一个Demo,希望有需要的朋友以后可以直接用到而不用再折腾。关于贝塞尔曲线的概念可以移步到这儿贝塞尔曲线的介绍 。原理其实很简单,根据贝塞尔公式,用四个点确定一个轨迹,然后通过给控件设置动画,根据时间计算出控件此刻应该在的位置(可以理解为在屏原创 2017-04-10 10:59:00 · 892 阅读 · 0 评论 -
开发遇到的坑,记录一下
前天测试提了一个bug:(华为)APP置于后台,灭屏后收到推送,亮屏后点击APP图标进入,APP会重新启动,且推送不能正常显示,期望:点击APP直接进入页面,并正常查看推送。。。被这个bug折磨了一天。。 刚开始打断点的时候,发现灭屏收到推送后,会进入融云的这个RealTimeLocationManager类中,然后程序进程就终止了,以为是融云内部哪个地方的处理把进程给原创 2017-04-10 10:59:03 · 466 阅读 · 0 评论 -
事件分发主要过程
Touch事件分发中只有两个主角:ViewGroup和View。ViewGroup包含onInterceptTouchEvent、dispatchTouchEvent、onTouchEvent三个相关事件。View包含dispatchTouchEvent、onTouchEvent两个相关事件。其中ViewGroup又继承于View。ViewGroup和View组成了一个树状结构,根节点为Acti原创 2017-04-10 10:59:33 · 636 阅读 · 0 评论