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
}
}
}

}

阅读全文

Java堆和栈区别简介

Heap: 堆
Stack: 栈
Heap内存的分配也叫动态内存分配

Stack内存相对于线程而言,执行函数时,内部变量的存储放在栈上边创建。Stack主要保存线程中方法中短期存在的变量值和对Heap中对象的引用。

区别:

  1. 堆不需要连续内存,空间较大; 栈是连续内存的区域,大小有操作系统决定。

阅读全文

应用分包主dex过大那些事儿

Too many classes in –main-dex-list, main dex capacity exceeded

1
2
3
4
5
6
com.android.dex.DexException: Too many classes in --main-dex-list, main dex capacity exceeded
at com.android.dx.command.dexer.Main.processAllFiles(Main.java:494)
at com.android.dx.command.dexer.Main.runMultiDex(Main.java:332)
at com.android.dx.command.dexer.Main.run(Main.java:243)
at com.android.dx.command.dexer.Main.main(Main.java:214)
at com.android.dx.command.Main.main(Main.java:106)

阅读全文

Glide使用中的问题

总结一下最近使用glide的过程中出现的两个比较棘手的问题

  1. glide没有提供从缓存中找到对应资源的api。
    对于这个问题,其实解决方案想到两个:第一个通过反射不改变源码的情况下能够做到;第二个只能是修改一下相关的源码,自己提供一个api让开发团队小伙伴使用。面对这两个选择我们只能选择第二个了,虽然改了源码对以后版本升级可能会出现一定的影响,但相对于反射来说其优势还是比较明显的。
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    /**
    * add by guangcong
    * 根据url, 从本地缓存中获取到缓存的图片
    */
    public static File findDiskCache(Context context, String url) {
    OriginalKey originalKey = new OriginalKey(url, EmptySignature.obtain());
    if (DiskLruCacheWrapper.wrapper == null){
    get(context).getEngine().initDiskCacheProvider();
    }
    if(DiskLruCacheWrapper.wrapper != null){
    try {
    File file = DiskLruCacheWrapper.wrapper.get(originalKey);
    if(file != null && file.exists()){
    return file;
    }
    } catch (Throwable e){
    e.printStackTrace();
    }
    }
    return null;
    }

阅读全文

Gradle之Transform

Transfrom

Trasnform API是gradle 1.5.0之后版本提供的,该API的作用是:允许第三方在打包Dex文件之前的编译过程中操作.class文件, 目前Android gradle插件中的jarMerge, proguard, multi-dex,instantRun等一些列操作都已经转换为Transform的实现了。

阅读全文

Groovy语法简介

Groovy

Groovy是一门JVM语言,也就是说Groovy的代码最终也会编译成JVM字节码, 交给虚拟机去执行。gradle之所以选择groovy语言,很重要的一个因素是groovy的结构看起来非常通俗移动,如同配置文件一般。
Groovy语法的简介:

阅读全文

AspectJ之android应用

之前也写过一下AOP在android上的应用和AspectJ如果再android上使用,而然近期看到一片非常好的文章,详细介绍了AspectJ的概念,以及给出了如何在android上使用AspectJ。 好了废话不多少,直接上作者原文:
http://blog.csdn.net/eclipsexys/article/details/54425414

阅读全文