Android 多线程,异步通信

1.Thread

start()和run()的区别
Thread的start方法开启了线程,并在线程中执行了run方法,而run则只是在当前线程中执行了其构造函数中传入的Runnable对象的run方法

2.AsyncTask的原理:

2个线程池(任务队列线程池+执行线程池)+ 1个Handler


3.HandlerThread:

HandlerThread本质上是一个线程类,继承自Thread。

HandlerThread本身有自己的Looper对象。讲HandlerThread中的Looper对象获取后传给Handler,就可以在Handler中的HandleMessage中处理异步消息

优点与缺点

优点:不会有阻塞,减少对性能的消耗

缺点:不能同时进行多任务处理,效率不高。HandlerThread是一个串行队列,内部只有一个线程。

HandlerThread的作用

一般是用在子线程跟子线程进行通信

4.IntentService

原理:IntentService是个抽象类,继承自Service,类中有一个mServiceLooper、一个mServiceHandler。在onCreate方法中创建了一个HandlerThread,并且通过HandlerThread获取到了mServiceLooper,最后通过这个mServiceLooper创建了mServiceHandler。mServiceHandler通过消息回调来处理多任务

面试题:
 (1)为何能执行耗时任务
         IntentService内部是采用Thread+Handler去处理任务的,也即是开启了新的线程,所以它是能执行耗时任务的
  (2)执行完任务为何会自动destory?
       在ServiceHandler的handleMessage方法里调用了stopSelf()

5.Handler

原理:在主线程中Android默认已经调用了Looper.preperMainLooper方法,调用该方法的目的是在Looper中创建MessageQueue成员变量并把Looper对象绑定到当前线程中(ThreadLocal)。当调用Handler的sendMessage方法的时候,就将Message对象添加到了Looper创建的MessageQueue队列中,同时给Message指定了target对象,其实这个target对象就是Handler对象。主线程默认执行了Looper.looper()方法,该方法从Looper的成员变量MessageQueue队列中调用Message的target对象的dispatchMessage方法(也就是msg.target.dispatchMessage方法)取出Message,然后在dispatchMessage方法中调用Message的target对象的handleMessage()方法(也就是msg.target.handleMessag),这样就完成了整个消息机制

6.EventBus

你可能感兴趣的:(Android 多线程,异步通信)