Java设计模式总结---单例模式

最近想系统的总结学习一下 java 的设计模式,于是做了计划每周搞一个。从最熟悉的开始吧—–单例 Singleton。

阅读全文

vim笔记一

光标

  • hjkl 四个键操作光标方向。 j, k 上下 h,l 左右。

    vim 的进入和退出

阅读全文

shell正则表达式

正则的意义

正则对于平时的开发工作是非常有意义的,如果不用正则有可能你需要复杂的逻辑去完成一个需求。然而,使用正则的时候经常会骂娘, 为什么骂娘? 无非两个原因: 一、看不懂了。二、忘记了规则实在写不出来。 其实,如果不是特别经常使用正则确实会忘的比较厉害。但是,如果你对正则进行一个深入的理解,是有助于长期记忆的。

阅读全文

Gradle守护进程导致的android打包异常

公司内部打包平台可以根据不同分支不同渠道信息进行自动化打包。昨天发版打包时竟然发现了一个特别诡异的问题导致生成的 apk 安装包直接崩溃。

阅读全文

SQLite迁移到GreenDao

从原生的 SQLite 迁移到 GreenDao 数据库框架整体上来讲还是相对比较容易的,这也归功与 GreenDao 易用的 API 和编译期注解。

阅读全文

Android数据库调研以及GreenDao3使用

网易新闻客户端对数据库的依赖是比较重的,很多数据都存在了客户端数据库,因此我们很早之前就想将数据库模块进行改造。于是我们对目前 Android 上使用比较广泛的数据库框架做了一个调研,并写了一个 demo 比较了一下各个框架的性能和易用性。

阅读全文

AOP技术在网易新闻中的应用

AOP概念

百度百科中对AOP的解释如下:
在软件业,AOP为Aspect Oriented Programming的缩写,意为:面向切面编程,通过预编译方式和运行期动态代理实现程序功能的统一维护的一种技术。AOP是OOP的延续,是软件开发中的一个热点,也是Spring框架中的一个重要内容,是函数式编程的一种衍生范型。利用AOP可以对业务逻辑的各个部分进行隔离,从而使得业务逻辑各部分之间的耦合度降低,提高程序的可重用性,同时提高了开发的效率。
说白了,AOP其实就是OOP的补充,OOP从横向上区分出一个个的类来,而AOP则从纵向上向对象中加入特定的代码。

阅读全文

网易新闻热补丁技术实践

两年之前android hot fix技术炒的非常热,各大厂商也是花样百出,各自献计,一时间出现了百家齐鸣的现象。但是各家都有各家的问题。当然网易其实也不甘落后,公司不同部门也研发了自己的热更新热补丁方案。网易新闻也是不断的探索未知,先后实践过一些方案, 目前使用的还是基于AOP的方案。
到目前为止,新闻android客户端上线热补丁技术也已经将近两年的时间了。也曾经为部门立下赫赫战功。一直想给这套方案起一个优雅的名字,但是始终没有想到满意的。直到今天早上,偶然间看到了一个单词Vulcan([‘vʌlkən]伏尔加,罗马神话中的火神与金工神),对这个词非常有感觉,那我就暂时已Vulcan对我们这套热补丁方案命名吧。
其实,很早之前就想写一下这套实践方案的思路,一直手懒没有写,今天看到了Vulcan这个词,一时兴起,提笔书之。

阅读全文

网易新闻瘦身实践

随着业务的不断增长,网易新闻客户端已经承载了过多的功能,不仅仅是一个新闻资讯的app,而是成了公司各个业务线的载体。因此,体积增长的问题就暴露了出来。体积最大时达到了30M,这对一个android应用级别的app来说算是非常大的了。于是不得不把瘦身的工作提到日程上。

阅读全文

AppBarLayout的五中ScrollFlags

最近使用CoordinatorLayout和AppBarLayout,总结一下AppBarLayout的scrollFlags属性;
scrollFlags共有五中取值提供给AppBarLayout的ChildView使用, 在布局中直接使用app:layout_scroolFlags设置, 对应的职位scroll, enterAlways, enterAlwaysCollapsed, snap, exitUntilCollapsed; 代码中通过’setScrollFlags(int)’来进行设置。

阅读全文

git仓库迁移

git仓库从一台服务器迁移到另外一台服务器:
1) 从原有仓库克隆一份裸版库,sample

1
git clone --bare git://github.com/username/project.git

阅读全文

OKHttp设置Header的那些坑

项目中网络底层库使用的okhttp,但是上层使用的Volley和glide;于是就设计的到了通用的请求header设置。于是通过Interceptor给设置的统一的header,但是okhttp的api确实有点坑啊。上线后发现图片的请求有两个UA,而且两个UA一个是我们设置的一个是glide默认的。
排查发现我们调用的Request.Builder.addHeader(k, v) 这个api是添加header,不会移除调之前有的header信息,比如设置UA,glide库设置了一个默认值,而我们又调用了这个api,这就产生了两个重复的UA。
正确的api是调用Request.Builder.header(k, v)来设置header,这个api会覆盖之前已有的header。
也可以先通过Request.Builder.removeHeader(K)先移除,然后再调用addHeader(K, V)

阅读全文

序列化-transient修饰符

Java的serialization提供了一种持久化对象实例的机制。当持久化对象时,可能有一个特殊的对象数据成员,我们不想用serialization机制来保存它。为了在一个特定对象的一个域上关闭serialization,可以在这个域前加上关键字transient。当一个对象被序列化的时候,transient型变量的值不包括在序列化的表示中,然而非transient型的变量是被包括进去的。

阅读全文

常用git命令

作者总结的很不错,非常适合git入门人员使用,转过来,并注明出处。来自于android开发精选公众号
常用git命令&version=12020110&nettype=WIFI&fontScale=100&pass_ticket=EECAVbQT98lTVrzTbXb78HOWwpX4a7eQQ7AS4ZidkNO3dzrZe6cK%2BFuOA8Jw47sk)

阅读全文

Gradle屏蔽指定的Task

公司项目使用了Fabric 进行crash的统计,但是最近不知是何故,fabric的几个域名无法访问了,更悲催的是fabric的gradle插件中有个任务需要访问这个域名上传一些编译生成的信息,这就直接导致客户端无法打正式的release包,一直卡在crashlyticsUploadDeobsRelease这个task。
测试了各种办法:a. 公司网络有没有对fabric指定的域名做黑名单; b. 通过代理vpn访问指定fabric的域名;均没有结果。
好吧,活人不能被尿憋死,只能放大招了,屏蔽调这个task。原理很简单获取到这个task,然后将enable属性设置成false。
gradle屏蔽掉指定的task

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
allprojects {
repositories {
jcenter()
}

//skip Test tasks
gradle.taskGraph.whenReady {
tasks.each { task ->
if (task.name.contains("crashlyticsUploadDeobsRelease"))
{
task.enabled = false
}
}
}

}

阅读全文