进程和线程相关
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机制用来传递消息, 实现异步通信。
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的创建方式的区别是啥?
主线程的looper是啥时候创建的?
注意事项, 创建常规message
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导致的内存泄露问题, 采用一套 弱引用的方案就很合适了。