interface和abstract区别:
- 都不能实例化
- interface里面的变量都用public static final修饰,方法都是public abstract方法
- abstract里面变量和方法都可以用public、protect、private关键字修饰,还可以有具体的方法和构造器
- 如果一个类(实现/继承)了(接口/抽象类),都要重写里面的全部抽象方法
进程间通信
- ADIL:利用Service跨进程通信
- Intent:访问其他应用的Activity
- Content Provider:跨进程共享数据
- Broadcast:被动接受广播
线程间通信
- runOnUIThread(Runnable r):里面代码会回到UI线程执行,基于handler实现
- handler:区别于runOnUIThread的是,handler更加基础,让你来自定义各种功能,延迟,标记,不太一定要用于工作线程通知UI线程,也可以UI线程通知工作线程(双向)。
- AsyncTask:基于handler实现,已经帮我们封装好了功能实现,有着明确的目的:里面会开辟新线程执行耗时操作,耗时操作过程还可以把操作进度反馈给UI更新进度,最后把执行的结果返回UI线程。
四个线程池
- 线程池出现原因:如果我们每次都用new Thread(new Runnable()).start来启动线程:每次都会新建对象占用内存,并且创建多次后让线程缺乏统一管理,也不能定义一些功能:周期,延迟,中断等
- new CachedThreadPool:创建一个可缓存的无限大的线程池,把已经执行后的线程回收,不用每次使用都创建线程
- new FixedThreadPool:创建一个自定义空间大小的线程池,可控制线程执行的最大并发数,超过并发数的线程在后面等待
- new ScheduledThreadPool:创建一个自定义空间大小的线程池,封装好了定时及周期性的执行任务的功能
- new SingleThreadPool:创建只有一个线程容量的线程池,只能用唯一的工作线程执行任务