线程间通信原理及Android多线程

2019-09-16  本文已影响0人  angeliur
线程间交互
Android的Handler机制

​ Thread 里 while 循环检查
​ 加上 Looper(优势在于自定义 Thread 的代码可以少写很多):
​ 再加上 Handler(优势在于功能分拆,而且可以有多个 Handler)

​ HandlerThread:具体的线程
​ Looper:负责循环、条件判断和任务执行
​ Handler:负责任务的定制和线程间传递

推荐Handler详解文章:

http://yifeiyuan.me/blog/f77487d3.html

https://www.zhihu.com/question/34652589

AsyncTask

AsyncTask 的内存泄露

众所周知的原因:AsyncTask 持有外部 Activity 的引用
没提到的原因:执行中的线程不会被系统回收

Java 回收策略:没有被 GC Root 直接或间接持有引用的对象,会被回收

GC Root:

  1. 运行中的线程
  2. 静态对象
  3. 来自 native code 中的引用

所以:AsyncTask 的内存泄露,其他类型的线程方案(Thread、Executor、HandlerThread)一样都有,所以不要忽略它们,或者认为 AsyncTask 比别的方案更危险。并没有。就算是使用 AsyncTask,只要任务的时间不长(例如 10 秒之内),那就完全没必要做防止内存泄露的处理。

Service 和 IntentService
Executor、AsyncTask、HandlerThead、IntentService 的选择

原则:哪个简单用哪个

关于 Executor 和 HandlerThread 的关闭

如果在界面组件里创建 Executor 或者 HandlerThread,记得要在关闭的时候(例如Activity.onDestroy() )关闭 Executor 和 HandlerThread。

@Override
protected void onDestroy() {
    super.onDestroy();
    executor.shutdown();
    handlerThread.quit(); // 这个其实就是停止 Looper的循环
}
上一篇下一篇

猜你喜欢

热点阅读