Latest

了解Gradle之groovy概览

def的用途 用def定义的变量时无类型的变量,这里所说的无类型的变量,并不表示该变量就不属于某一个类型了,def修饰变量正是Groovy为动态语言的标记,大概def修饰变量就相当于Java中Object来修饰变量吧。如果通过使用def关键字使用可选类型,那么整数的类型将是可变的:它取决于这个类型实际包含的值。 assert a instanceof Integer //assert a instanceof Long//错误 def b = 2147483648 assert b instanceof Long 关于函数的定义 如果所定义的函数没有参数,那么必须在调用的时候加上括号。 要有返回值的类型声明,如def、void、String等。 可以使用return返回值,若不写,则默认返回最后一行的值,没有则为null。 闭包是什么? A closure in Groovy is an open, anonymous, block of code that can

Android中的apk打包

Android中的apk打包

前言 使用友盟对应用进行信息收集时,其中包含有一个渠道名。渠道姑且可以认为是一个商店吧,如果应用要在很多个商店上面上架的话,一直改太麻烦了。有一个叫做多渠道打包的东西自然而然地走了过来。 多渠道打包实现 <meta-data android:name="UMENG_APPKEY" android:value="xxxxxxxxxxxxxxxxxxxxxx" /> <meta-data android:name="UMENG_CHANNEL" android:value="Google Play Store" /> 如上所示,如果需要换一个渠道的话,重新改的话就特别麻烦了。先将其中的value替换成占位符${UMENG_CHANNEL_VALUE}。接下来到模块下的build.gradle中进行相应的修改。修改大致如下: <meta-data

Android中的签名

Android中的签名

签名,顾名思义与生活中的签名类似,为某个东西签了名,那么这个东西就与所签的名字产生了某种关系,如归属等。 为什么要为Android应用签名? 这是因为Android系统的要求就是这样,Android系统要求每一个Android应用程序必须要经过数字签名才能够安装到系统中,也就是说如果一个Android应用程序没有经过数字签名,就无法安装到系统中。 为什么在AS中直接RUN可以安装到系统上? 因为这种方式会使用Android Studio默认生成的debug签名,去给应用进行签名。 签名不同会怎样 如果同一应用使用不同的签名,那么将不能覆盖安装,必须先卸载之前的,然后再安装。 1)两个程序的入口Activity是否相同。两个程序如果包名不一样,即使其它所有代码完全一样,也不会被视为同一个程序的不同版本; 2)两个程序所采用的签名是否相同。如果两个程序所采用的签名不同,即使包名相同,也不会被视为同一个程序的不同版本,不能覆盖安装。 所以这也是为什么,同样一份代码,由不同的机器RUN,然后安装到同一台设备上时,需要先卸载之前的应用,而后再安装此次的。 原因就是每台机器默认

分清堆和栈

分清堆和栈

其实关于堆栈的问题在脑海中盘旋了挺久的了。从C语言开始,到数据结构,再到现在的Java,它一直在!现在就让我们从头开始吧。 明确概念 首先应该明确堆和栈是不同的东西,其次数据结构中的堆和栈与编程语言中的堆和栈不是同一个概念。 从数据结构说起 栈:即Stack,是一个LIFO队列。对它的操作有pop(),push(),peek()等。 堆:即Heap,是一棵完全二叉树(heap的某一种),它的特点是父节点的值大于(小于)两个子节点的值(分别称为大顶堆和小顶堆)。 具体内容可以参考后续关于数据结构的系列博客。 再到C语言 int a = 0; //全局初始化区 char *p1; //全局未初始化区 main() { int b; //栈 char s[] = "abc"; //栈 char *p2; //栈 char *p3 = "

Android中的looper与handler

Android中的looper与handler

前言 为什么会有这么一篇网上有很多种解说版本的博客?因为我看懂了很多次,都没有把自己的想法记下来,然后就忘了。那样不仅浪费时间、而且还有点伤积极性。 从一个异常出发开始 在《第一行代码》中看到了关于异步处理消息的用法时,有没有想过可以在子线程中去new一个Handler?现在就开始着手,从一个子线程中去new一个Handler,看看会有什么发生。 new Thread(new Runnable() { @Override public void run() { new Handler(); } }).start(); 结果就出现了RuntimeException异常,仔细看它的信息说明。 java.lang.RuntimeException: Can't create handler inside thread that has not called Looper.prepare() 那么可知,在每个线程new Handler()时,都必须先调用Looper.prepare(