[译]使用注解处理器生成代码-2 注解处理器

 原文请看摸我
 这是有关注解代码生成技术系列博文的第二部分。在第一部分(摸我)中,我们介绍了注解的基本概念与用法。
 在本篇博文中我们将介绍注解处理器的基本概念和使用运行方法。

介绍

 注解功能强大。你可以使用注解来设置各类元数据或者配置信息,语法格式优雅并且功能强大。
 从目前我们了解的知识来看,注解比起Javadoc来有很多优势,但是这些好像都不足以委员会将其加入java语言之中。那么,我们可以更好的利用和了解注解吗?当然可以啦:

  • 在运行时刻,带有runtime retention policy的注解可以通过反射获得,Class类中的getAnnotation()getAnnotations()方法可以做到这些。
  • 在编译时刻,注解处理器可以处理在编译时发现的各类注解。
Read More
Share

使用注解处理器生成代码-1 注解类型

 原文地址如下:摸我
 我希望以此篇博文作为基于注解处理器生成代码系列博文的开篇,给大家展示注解处理器有多么强大,并在最后使用这项技术来在编译时刻生成android代码
 在这个系列博文中,我们会:

  • 介绍Java语言中的注解
  • 理解注解的基本用法和作用域
  • 了解Annotation Processor基础知识和作用
Read More
Share

图解Android事件传递之ViewGroup篇

 本篇文章主要讲述ViewGroup中关于触摸事件传递的相关逻辑。主要梳理一下dispatchTouchEvent函数。

一些知识点

  • FLAG_DISALLOW_INTERCEPT,可以使用requestDisallowInterceptTouchEvent来设置ViewGroup的这个标记位,让ViewGroup不拦截事件。
  • ViewGroup只会将触摸事件转发给那些可见并且触摸事件发生在其可视范围内的子View
  • 如果一个子View没有接收ACTION_DOWN事件,那么这个事件系列的ACTION_MOVE或者ACTION_UP事件根本不会传递给它
Read More
Share

图解Android事件传递之View篇

 最近放假在家里闲着,想好好研究一下android的事件传递机制。于是便抓来View,ViewGroup这些类的源代码来看;有很多疑惑,又在网上找到了几篇比较好的介绍事件传递机制的文章阅读了一番。然后想着最好把学习到的知识输出一遍,画成视图,写下这篇博文。
 除了图片,我还在源码上进行了注释,提交到了github上去。我的github

View的dispatchTouchEvent

View-dispatchTouchEvent.png

View的onTouchEvent

View-onTouchEvent1.png

View-onTouchEvent2.png

参考的文章

Read More
Share

《Redis设计和实现》读书笔记1-简单动态字符串

 临近过年,我离开了实习了4个多月的扇贝。临走前,导师赠送给我一本《Redis设计和实现》,于是心血来潮,想读一读这本书,然后仿照书中介绍的原理实现一个小型的数据库。这是redis系列的第一篇博文,希望我可以坚持下去,不要虎头蛇尾。

简单动态字符串

 我们都知道Redis是由纯c代码编写而成的,而c语言中的原生字符串有很多的缺陷,不利于大型工程的使用。于是Redis的作者便自己实现一套字符串数据结构,就是sds.h/sdshdr结构。

SDS的定义

struct sdshdr {

Read More
Share

师者的教导

 最近一段时间,我一边在扇贝实习,一边跟着学校里的导师进行本科毕业设计.在公司里,mentor言传身教的教导我写出更简洁和具有统一风格的代码;在学校里,导师耳提面命的教导我如何一步一步的进行科研论设计.虽然很忙碌,但是却收获很多.

做好本职工作是否足够好?

 扇贝公司是一个小厂,没有测试,设计给出的设计图和标注也不时会有些问题.我之前对此也有点不满,认为不给出标注或者色值会拖延开发进度,有时为了调整一个界面的margin,padding或者字号就要花费很长时间.但是mentor却认为这对我来说是一个很好的机会.因为我之前在腾讯实习时,设计给出的界面图很规范,使用dp进行标注,并且会有不同屏幕大小的标注.但是那样就养成了一种毫不思考和关心UI设计,交互设计,只是负责把设计的界面100%的实现出来就可以啦的习惯.但是在扇贝,我们可以和设计进行交流,提出更好的界面设计.为此我特定学习了一个Google力推的Material Design风格.好的员工,一定不是只做好了本职工作.我之前总是自以为是的认为快速就实现各类需求就是很好,却完全没有思考需求中设计和产品方面的考虑.

你思维是否有局限性?

 本周公司举行了年会,我们android组的成员和产品组的三个妹子一起表演一段舞蹈.我们可真不是跳舞的料啊,全靠妹子带领.于是我们约定在周六下午去公司再排练一下.mentor也真是把工作上的习惯带到了舞蹈排练中啊.一开始排练,就开始定下接下来半天中每1个小时的安排和任务.不过这样确实很有效果,虽然当时听他一本正经的说每个小时任务时感到十分搞笑.然后第二天时,他又一本正经的来找我,说我们忘记了一件事情.在我正在疑惑时,他说:”我们排练时把会议室的桌子移动啦,然后排练结束后没有把它恢复原位.”.说实话,当时我的心中有一万个草泥马飞奔而过啊.不过后来想一想,mentor这些做事情的思维或者规范确实有很多好处.我们那天下午舞蹈练的就很好,然后在年会中获得表演奖第三名.做事情都是有通用技巧的,很多时候,你只是没有想到需要使用技巧去做事.举个例子吧.每天中午吃完饭,我一般都会和同事在公司打乒乓球.我技术很不好,希望多练练,逐渐打好乒乓球.但是好像我除了每天去打乒乓球之外好像再没有做什么额外的事情,没有做那些让我在练习过程中能更好的提高的事情.为什么不找个视频学习一下打乒乓球的技巧,然后再在练习中进行对应的训练呢?这样不比你每次上去胡乱打要好的多吗?生活中这样的例子很多很多.

你的弱项在哪里?怎么办?

 最近学校里的导师带着我在做程序缺陷分析方面的研究,想依此来写一篇本科毕业论文.在这期间,我犯了很多很多错误,现在回想起来还真是不应该.而且老师也善意的支持了我的优点和缺点,认为我多在涉及缺点的方面下功夫.
 首先,我和导师一周见一次面,讨论这一周内项目的进展和下一周的计划.其实,这样的交谈我应该每周都做一次记录的,但是我没有,导致项目进行到一半,再回顾早期讨论的内容,很多细节都不太记得啦.很多事情,要及时做好记录,回顾,和总结.这一点也可以用在工作中.每完成一个需求,其实可以做一次总结,把期间学习到的新知识(大概就是你google搜索到的代码逻辑)和犯的错误总结一下.
 然后导师认为我表达能力有问题,经常无法准确表达自己的观点,而且经常让别人无法理解自己话语的含义.所以他让我需要注意一下这方面.他还认为我的动手能力和理解能力都很强,但是表达能力有限,所以经常分配一些写作任务给我(就是把实验目的,计划,方案,原理写成文章的任务),依此来训练我.知道自己的强项和弱项,并进行提升
 上一周导师和我讨论了写论文的比较重要的步骤或者过程.首先是这个观点或者题目是否有意义,是否值得做;然后是什么样的实现数据可以支持你的观;最后是如何实验来得出数据.三个过程的重要程度依此降低,如果前边的过程出现问题,那么后边过程所付出的努力就白费啦.

总结

 十分感谢两位老师的教育和指导.

Read More
Share

Material Design 标注图

 最近发现自己在实现产品需求时,在界面元素的细节部分把握不够准确,经常被leader告知需要微调一下界面元素的各类尺寸.虽然导致这个因素的最重要的原因是我场的设计太懒,不给标注,但是作为一个终端工程师,了解并掌握足够的设计相关的知识还是十分必要的,于是最近就开始研究其google的Material Design设计风格.
 本篇文章主要是收集一些MD风格的设计标注图和注意事项,主要内容都来自于重磅教程!帮你全面彻底搞定MATERIAL DESIGN的学习笔记.

MD风格的精髓在于
把物理世界的体验带进屏幕,去掉现实的杂质和随机性,保留保留其最原始纯净的形态、空间关系、变化与过渡,配合虚拟世界的灵活特性,还原最贴近真实的体验,达到简洁与直观的效果

 其实以我现在的理解就是:

Read More
Share

Android文件存储位置简述

 最近一段时间,工作和学习方面都比较忙,所以,博客方面有一段时间没有投入时间啦,今天学习了一下android文件存储方面的知识,主要是Internal StorageExternal Storage的相关特性.主要知识来自android的官方文档和其他人的博客.

Internal Storage

 一般来说,你可以直接存储文件在机器的internal storage中,存储在这个位置的文件是私有的,其他应用无法获得.但是当用户卸载你的应用时,文件就被删除啦.

通过openFileOutput()传入文件的名字和操作模式,就可以获得FileOutputStream,然后就可以write(),然后close啦.

Read More
Share

OkHttp解析系列-重定向和出错重试

&emps;这是OkHttp系列博文的第一篇,之前写过一篇草稿,介绍OkHttp的整体框架,但是感觉涉及的知识太多,无法在一篇中讲述清楚,所以,之后的博文都只关注某一方面的知识,争取文章短小精悍。
 今天主要研究一下OkHttp发送Http请求过程中的重定向和出错重试,主要涉及的源码文件有Call.java``HttpEngine.java
 我们今天研究CallResponse getResponse(Request request, boolean forWebSocket) throws IOException函数,它是你调用Call.execute()返回Response所调用的核心函数,主要功能是新建一个HttpEngine发送Request然后处理出错重试和重定向问题。

设置Headers

  // Copy body metadata to the appropriate request headers.
    RequestBody body = request.body();

Read More
Share

OkHttp解析系列-开篇

背景

 前几天使用react-native遇到了底层okhttpcookie无法保存的问题,由于自己对http和okhttp也不是很了解.所以想开一个系列的博文,借助详细解析okhttp的详细解析来梳理一下http相关的知识。

Okhttp

Okhttp是很火而且效率很好的一个android的网络库,被很多app或者开源库使用或者集成,比如react-native,官网地址如下戳我.

UML类图

 事先声明,我画的这张UML类图不够标准,正方形的虚线边框是我自己添加上去的,只是逻辑上或者概念上的分类,标示这些类大致是属于哪个模块的,而且也没有添加各个类之间的依赖关系。之所以使用这张图,主要是希望表面okhttp代码的不同模块吧。也算为以后的博客进行内容区分。
enter image description here

Okhttp模块

 之后的博客,就会按照上图的不同模块来进行,首先是OkHttp的主要框架模块,然后是请求和响应相关的模块,然后是关于http机制的模块,最后是关于http报文格式的模块。现在计划是如此,可能在博文之间会添加一些http知识。就这么愉快的决定啦。

Share