由于公司业务发展需要,c++转型搞android开发。学习路线如下:
1 kotlin语法,Androidstudio教程
2 Android系统,linux内核,ART虚拟机(android5.0以后默认,dalvik已弃用),多进程,线程,协程,四大组件,内存分配与回收
3 新建demo project,动手写例子,关注编译报错并解决
px,sp和dp
px :像素,一张图片最小的点,不是自然界的长度单位
dp:基于屏幕物理密度的抽象单位
密度(dpi):每英寸包含的像素个数(单位是dpi)
px = dp * (dpi / 160)
sp:可伸缩像素的意思,采用和dp同样的设计理念,解决了文字大小设配的问题
inline,noline,crossline
inline内联,调用处类似代码替换
noline,不内联,例如
private inline fun myMethod(former: () -> Unit, noinline latter: () -> Unit)
crossline,避免非局部返回
fun main() {
println("start execution:")
sayHello {
println("in lambda")
return //main返回返回,end execution不打印了
}
println("end execution")
}
private inline fun sayHello(block: () -> Unit) { //此处应加crossinline
println("in sayHello")
block()
}
前台Service与WorkManager
Intent-序列化-Bundle
Intent传递的数据类型有限,除一般的数据类型外,例如对象,队列都是无法传输的。所以需要序列化,3种方式
Serializable接口(代码短效率低):用法 intent.putExtra,intent.getSerializableExtra
Parcelable接口(代码多效率高):用法 writeString,writeInt,intent.getParcelableExtra
Bundle类:用法 intent.getBundleExtra
object关键字
对象声明(Object Declaration),单例模式
伴生对象(Companion Object),静态变量
对象表达式(Object Expression),匿名内部类
协程五种创建方式:(须添加依赖)
build.gradle的dependencies中添加 compile 'org.jetbrains.kotlinx:kotlinx-coroutines-core:0.22.5'
public interface Deferred
协程调度器CoroutineDispatcher
Dispatcher.Default
默认调度器。它使用JVM的共享线程池,该调度器的最大并发度是CPU的核心数,默认为2
Dispatcher.Unconfined
非受限调度器,它不会将操作限制在任何线程上执行——在发起协程的线程上执行第一个挂起点之前的操作,在挂起点恢复后由对应的挂起函数决定接下来在哪个线程上执行。
Dispathcer.IO
IO调度器,他将阻塞的IO任务分流到一个共享的线程池中,使得不阻塞当前线程。该线程池大小为环境变量kotlinx.coroutines.io.parallelism的值,默认是64或核心数的较大者。
该调度器和Dispatchers.Default共享线程,因此使用withContext(Dispatchers.IO)创建新的协程不一定会导致线程的切换。
Dispathcer.Main
该调度器限制所有执行都在UI主线程,它是专门用于UI的,并且会随着平台的不同而不同
对于JS或Native,其效果等同于Dispatchers.Default
Kotlin协程的异常有两种
因协程取消,协程内部suspend方法抛出的CancellationException
常规异常,这类异常,有两种异常传播机制
launch:将异常自动向父协程抛出,将会导致父协程退出
async: 将异常暴露给用户(通过捕获deffer.await()抛出的异常)
Jetpack组件库
build流程
java代码块 4种
1.普通代码块:就是类中方法的方法体
public void xxx(){
//code
}
2.构造块:用{}裹起来的代码片段,构造块在创建对象时会被调用,每次创建对象 时都会被调用,并且优先于类构造函数执行。 构造块中定义的变量是局部变量。
{
//code
}
3.静态块:用static{}裹起来的代码片段,只会被执行一次(第一次加载此类时执行,比如说用Class.forName("")加载类时就会执行 static block),静态块优先于构造块执行。
static{
//code
}
4.同步代码块:使用synchronized(obj){}裹起来的代码块,在多线程环境下,对共享数据进行读写操作是需要互斥进行的,否则 会导致数据的不一致性。常见的是synchronized用来修饰方法,其语义是任何线程进入synchronized需要先取得对象锁 如果被占用了,则阻塞,实现了互斥访问共享资源。而synchronized也是有代价的。 一个常见的场景是,一个冗长的方法中,其实只有一小段代码需要访问共享资源,这时使用同步块,就只将这小段代码 裹在synchronized block,既能够实现同步访问,也能够减少同步引入的开销。 同步代码块须写在方法中。
synchronized(obj){
//code
}