android.os包

进程和线程相关

Process

Tools for managing OS processes.

  • setThreadPriority

Set the priority of a thread, based on Linux priorities.

priority
int: A Linux priority level, from -20 for highest scheduling priority to 19 for lowest scheduling priority.

AsyncTask

Handler,Looper, Message, MessageQueue

https://juejin.im/post/5abb3e345188255c887bb01e

handler机制用来传递消息, 实现异步通信。

image.png

looper是线程隔离的, 每个线程最多创建一个looper, 并在looper创建的同时在looper内部创建一个messageQueue, messageQueue和创建其的looper是绑定的, 因为looper和 messageQueue是线程隔离的;
一个looper实例可以创建多个handler对象。

handler实现了消息的分发和处理;
Message作为消息的载体;
looper实现了消息出队和分发;
MessageQueue维护了消息队列;

handler处理消息有2种方式:
方式1:


        Handler handler = new Handler(Looper.myLooper(), new Handler.Callback() {
            @Override
            public boolean handleMessage(Message message) {
                return false;
            }
        });

        handler.sendMessage(Message.obtain());

方式2: 直接在runnable中处理

 new Handler(Looper.myLooper());
        
        handler.post(new Runnable() {
            @Override
            public void run() {

            }
        });

handler创建的方式有:


// 方式1 
        new Handler();
        
// 方式2 
        new Handler(new Handler.Callback() {
            @Override
            public boolean handleMessage(Message message) {
                return false;
            }
        });

// 方式3 
        new Handler(Looper.myLooper());


        new Handler(Looper.getMainLooper());


// 方式4 
        new Handler(Looper.myLooper(), new Handler.Callback() {
            @Override
            public boolean handleMessage(Message message) {
                return false;
            }
        });
        

上述的4种handler的创建方式的区别是啥?

image.png
image.png
Looper.java.png
子线程在创建属于子线程的handler之前,先创建一个与子线程绑定的looper.png
image.png
image.png
image.png

主线程的looper是啥时候创建的?


image.png

注意事项, 创建常规message

image.png

handler 内存优化

https://blog.csdn.net/izera/article/details/51024736

还有在 activity 的 onDestroy 中 将handler消息置空也是一种手段。

两者结合, 会更好。

不用理会是不是在activity中创建handler的静态类及静态类的实例,
在 任何的view, viewGroup, fragment里均可以创建handler的静态子类实现, 然后通过弱引用的方式,应用具体的view, viewGroup, fragment实例。

利用handler获取view的宽,高参数

https://www.jianshu.com/p/dfdd0079da72

Rxjava优雅的替换handler

http://ngudream.com/2016/09/10/rxjava-eventbus/

AsyncTask源码

https://github.com/aosp-mirror/platform_frameworks_base/blob/master/core/java/android/os/AsyncTask.java

AsyncTask底层维护的是一个线程池;

使用AsyncTask的原因是因为它可以实现后台耗时工作, 和工作线程到UI线程的切换;

在AsyncTask中弱引用activity, view, viewGroup, fragment,
避免内存泄露;

https://blog.csdn.net/womengmengyan/article/details/52315564

退出当前页面, 可以判断下后台工作线程是否还在执行, 如果还在执行的话, 可以调用AsyncTask的任务取消方法, 以期及时释放资源;

handler为啥会导致内存泄露呢?

是因为messageQueue对handler的引用;
如果messageQueue能及时释放对handler的引用, 也就不会造成内存泄露了。

总之关于handler导致的内存泄露问题, 采用一套 弱引用的方案就很合适了。

Messenger

你可能感兴趣的:(android.os包)