闲话元注解@Retention 元注解@Retention元注解是用来描述注解的。@Retention用来描述注解将会在哪个层次存在,有三个值:RetentionPolicy.SOURCE:只会在java文件中存在,class文件中就不可见了。可以被编译器使用RetentionPolicy.CLASS:会在class中可见,不需要被虚拟机加载。编译时可见RetentionPolicy.RUNTIME:在class中可见...
2019年年终总结 19年的感悟,两个词:分层以及学习。分层这个社会是分层的,只是每一层的界限不那么明了,但它确实就在那。软件开发这个行业也多是分层的,OSI七层模型,TCP/IP五层模型,都是分层的,所以分层的意义是什么呢?Android开发都会提到一个组件化、模块化的概念,其实也是分层,每层做自己的事情,相近的两层有沟通,职责分明,简单明了,这既是软件行业也是这个社会分层的意义吧。学习其实这个词总结...
ArrayMap数据结构分析 ArrayMap是Android上特有的一个性能比较高的Map,和HashMap一样,也实现了Map接口。这里只分析其数据结构部分,不分析其高效缓存部分。分析ArrayMap的结构是int[] mHashes,记录每个key的hash值;Object[] mArray记录Key和Value,对于每一组Key和Value,按照Key和Value的顺序排列。put(K,V)时,首先根据K计算出...
1.8ConcurrentHashMap源码分析 ConcurrentHashMap是一个线程安全的HashMap,ConcurrentHashMap和HashMap的底层数据结构相同,都是数组+链表+红黑树;但是hash方法、键、值不允许为null和Hashtable一样,并且都是线程安全的,只不过实现同步的细节上有所差别。尽管支持高并发的读写,但是ConcurrentHashMap在读操作时不会加锁。关于HashMap和Hashtable...
SparseArray源码分析 Android有一组自己的集合类,原因是使用java的集合太占内存。这里主要介绍下SparseXXX系列的容器。SparseArray将int映射成object,类似Map<Integer,Object>,但是由于不需要自动装箱,因此会更节约内存。另外,与HashMap的区别是,由于key是int的,因此其查找使用的是二分查询,而不是hashMap的哈希查询,因此SparseArr...
Flutter状态管理(2)——单Stream和广播Stream 在Flutter状态管理(1)——InheritedWidget中介绍了状态管理以及如何使用InheritedWidget来实现全局状态的管理。这篇博客将介绍如何使用Stream来实现状态管理。Stream是一种流,在dart中用于异步产生数据,分为两种类型:单订阅Stream和广播Stream。单订阅Stream只允许在该Stream的整个生命周期内使用单个监听器,即使第一个subscript...
Flutter状态管理(1)——InheritedWidget 状态管理Flutter的状态管理分为两种:局部状态和全局状态。局部状态:根据官方的含义,就是一个StatefulWidget可以搞定的,比如BottomNavigationBar、PageView等等,其他Widget不需要知道你的状态,你也不需要依赖其他Widget的状态;setState可以实现状态的切换;全局状态:整个app很多页面都需要用到的状态,比如是否登录了,用户名、用户id等;...
Flutter数据传输 从上往下数据从根往下传数据,常规做法是一层层往下,当深度变大,数据的传输变的困难,flutter提供InheritedWidget用于子节点向祖先节点获取数据的机制,如下例子:class FrogColor extends InheritedWidget { const FrogColor({Key key, @required this.color, @required Widget c...
Flutter版本玩Android客户端(7)——状态管理 在上一篇文章Flutter版本玩Android客户端(6)——登录注册模块以及文章收藏与取消中完成了登录模块,但遗留的问题是未进行状态同步,导致left drawer的状态没有变化。本文继续完善该部分,效果如下:状态管理对于登录状态这个值,很多widget需要用到,属于全局状态,这里使用provider进行管理。关于状态管理的更多知识,可以参考后面的文章。提供初始化状态在main入口处...
Flutter版本玩Android客户端(6)——登录注册模块以及文章收藏与取消 本篇继上篇Flutter版本玩Android客户端(5)——微信公众号tab点击跳转后,完成了登录注册模块,以及文章收藏与取消。但仍有部分没有完成,比如登录状态的同步,drawer的header中没有因登录状态而改变。先看效果:登录注册玩Android登录后,会返回一个cookie,需要将该cookie保存,然后在一些post接口上带上该cookie表示用户信息,比如收藏、取消收藏都隐含...
Flutter版本玩Android客户端(5)——微信公众号tab点击跳转 在Flutter版本玩Android客户端(4)——知识体系tab点击跳转中,完成了主页面知识体系tab的点击跳转,本文主要完成微信公众号tab的跳转。效果如下:微信tab的跳转微信tab的跳转后也是一个文章列表,复用ArticleList这个Widget。代码如下:class _WeChatArticleListWidgetState extends State<WeChatAr...
Flutter版本玩Android客户端(4)——知识体系tab点击跳转 在Flutter版本玩Android(3)——文章详情页中完成了用webview加载文章详情页,本文趁热打铁,完成知识体系tab的跳转逻辑。和以往一样,先看效果:体系小item的跳转文章列表Widget的封装小item的跳转到一个文章列表,由于发现文章列表和首页可以公用,因此将其抽离出来,完成封装,如下:class ArticleListWidget extends Stateless...
Flutter版本玩Android(3)——文章详情页 本文主要包含路由的跳转以及WebView显示文章详情页。效果如下:路由跳转Flutter通过Navigator类来进行页面路由的管理。push:指定跳转的widgetpushNamed:命名路由,string—>widgetpushXXX表示跳转到下一页面,pop表示跳出当前页面,可以携带参数跳转。具体可以参考路由管理。携带参数跳转Navigator.of(contex...
跨平台开发的那些事 跨平台架构oc中,直接引用c、c++代码的需要命名为mm格式自己开发的framework是静态库;Android的.so是共享库os x中,.a表示静态库,.dylib表示动态库linux中,.a表示静态库,.so表示动态库windows中,.lib表示静态库,.dll表示动态库绿色表示库,黄色表示接口层,红色表示调用层CMakeCMake是一个开源的跨平台自动化构建系...
Flutter版本玩Android(2)——主页面数据获取 上一部分构造了主页面,这一部分主要完成主页面三个tab的数据获取,下一步的点击事件目前都未处理。先看下效果:使用的库这部分接入了几个三方库,分别是:网络库:Dio,这部分封装了一个单例出来,负责网络请求首页轮播图:BannerViewjson序列化:json-serializable,这部分需要注意如何生成辅助代码,可以参考后面的example首页下拉刷新、上拉加载:pull_t...
Flutter版本玩Android客户端(1)——搭建主页面 最近在学Flutter,想着画点时间做个app,就做玩Android,可以利用现有的APi进行操作。第一步:搭建主页面,如下:主要包括几部分:AppBar,包含Drawaer,可以打开BottomNavigationBar:底部导航栏,切换时body内容变换图标第三个使用了三方图标,后面重点说下如何使用第三方Icon;如果使用Image作为Icon,那么点击的变色不会存在,而使用Ic...
你应该了解的JNI知识(三)——注意点 native层打印logcat日志native层打印logcat日志,有两种方式:调用Java层的Log.i/v()之类的方法,可以参考你应该了解的JNI知识(二)——Java与JNI互相调用,里面介绍了如何在native层调用Java代码。使用liblog.so进行打印,和Log.i/v()底层使用同样的原理这里主要介绍如何使用第二种方法打印日志。主要包含三个步骤:cmake文...
你应该了解的JNI知识(二)——Java与JNI互相调用 在你应该了解的JNI知识(一)——静态注册与动态注册中,了解了JNI是如何使用的,以及两种注册方式的使用以及区别。本篇博客将介绍Java和JNI的互相调用,因此主要包括两部分:JNI层调用Java层Java层调用JNI、Native层JNI层调用Java层JNI层调用Java层有点类似Java的反射机制,需要首先找到类、再找到某个方法或字段,再进行调用。这里涉及JNIEnv的几个方法...
你应该了解的JNI知识(一)——静态注册与动态注册 最近一直在做native这边的跨平台开发,整个结构基本就是下图:大体说来就是,底层C/C++代码。那么对于两端分别有不同的处理:对于Android端而言,由于需要给Java端使用,因此需要提供JNI接口,然后将整个的代码打包编译成.so给Android端使用对于iOS端,由于oc是可以直接调用c的,但是需要将代码打包编译成iOS需要的Framework,然后由于需要给iOS端使用,...
从0到1实现一个Android路由(6)——拦截请求再跳转 在从0到1实现一个Android路由(2)——URL解析器中,提到过请求拦截,其中有个常见的场景是某个页面是需要登录状态的,那么首先要调到登录页,完成了登录之后再跳转到路由页面,但通常登录页都是跳转到主页面的,这该怎么实现呢?上篇文章中没有解决这个问题,本文主要来解决这个问题。解决这个问题的核心是Hook,接管startActivity(),进行偷梁换柱。因为所有的跳转最终都是通过startAc...