• Android 多线程机制


    多线程操作数据需要使用同步

    1. public class CustomThread extends Thread {
    2. private Runnable runnable;
    3. synchronized void setTask(Runnable runnable) {
    4. this.runnable = runnable;
    5. }
    6. @Override
    7. public void run() {
    8. while (true) {
    9. synchronized (this) {
    10. if (runnable != null) {
    11. runnable.run();
    12. runnable = null;
    13. }
    14. }
    15. }
    16. }
    17. }

    ThreadLocal 给每个线程独立空间,且不会被共享出去

    Loop.myLoop()获取当前loop,内部实现是 mThreadLocal.get() 获取当前线程的loop

    Loop.getMainLoop() 获取主线程Loop

    变量为 ThreadLocal sThreadLocal = new 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

  • 相关阅读:
    vue2的双向绑定
    前端静态页面部署到服务器-Nginx
    搭建repo服务器管理多个git工程
    3D detection metrics介绍
    如何进行企业数字化转型?数字化转型的3大核心规律
    Allegro如何录制SCR快捷键操作指导
    js解析url
    MySQL -- 环境安装(CentOS7)
    【从删库到跑路】MySQL数据库 | 存储过程 | 存储函数(使用代码辅助理解)
    NDK报错问题分析方案(一)
  • 原文地址:https://blog.csdn.net/qq_29769851/article/details/134321216