多线程操作数据需要使用同步
- public class CustomThread extends Thread {
- private Runnable runnable;
-
- synchronized void setTask(Runnable runnable) {
- this.runnable = runnable;
- }
-
- @Override
- public void run() {
- while (true) {
- synchronized (this) {
- if (runnable != null) {
- runnable.run();
- runnable = null;
- }
- }
- }
- }
- }
ThreadLocal 给每个线程独立空间,且不会被共享出去
Loop.myLoop()获取当前loop,内部实现是 mThreadLocal.get() 获取当前线程的loop
Loop.getMainLoop() 获取主线程Loop
变量为 ThreadLocal
Android 主线程其实就是HandleThread
Loop.loop 是个死循环
for(;;){
Message msg = queue.next();
//处理
msg.target = Handler 每个消息都要hanlder处理
dispatchMeaasge (Message msg){
//判断有没有CallBack
//处理callback
else
//处理
}
}
一个Loop可以有多个Handle
Handle 机制是在指定的运行中的线程中执行代码
线程间交互并不存在真实的交互,而是通过共享资源来进行的
通过HandleThread.post可以插入一个任务
AsyncTask 内存泄露 ,如果AsyncTask不加static 会一直持有使用它的类的引用,导致不能被Gc回收
内部类都会持有外部类的引用 可以使用WeakReference<> 弱引用持有
System.gc 有一个条件就是正在执行的线程/静态对象/直观的引用 不会被回收
Thread / Handle/Runnable 也可能会导致内存泄漏
后台处理优先使用Execute和HandleThread 几乎没什么区别 HandleThread是单线程
IntentService 是一个Service /比较重 引用多
Service - IntentService
Service 后台活动的空间,
IntentService-需要上下文Context 则使用
Android Performance Patterns