1.相关说明
l Android中所有的UI界面、监听器事件的处理都放在一个主线程中(main线程)。
Main线程何时启动?Android应用启动时。
Android应用程序入口点:ActivityThread
l Android中所有的耗时操作都放在工作线程中。通常将由主线程启动的线程称为工作线程。
l 当我们在AndroidUI界面触发一个事件,例如点击一个Button按钮,此时会向主线程发送一个消息,主线程收到此消息后,会对消息进行相应处理,例如调用onClick方法指向相关操作。
FAQ?
a. 由谁负责向主线程发送消息(Message对象)?(Handler)
b. 消息发送以后,存储在哪?(MessageQueue)
c. 谁负责发现消息,并找到消息?(Looper)
d. 主线程发现消息后由谁负责处理消息?(Handler)
伪代码描述:
class Message{}//消息
class MessageQueue{//消息队列
Private Message[] messages=new Message[10];
//...
}
class Looper{//内置一个死循环(发送消息,并找到消息)
private MessageQueue messageQueue=new MessageQueue();
}
class Handler{//发送和处理消息
private Looper;
private MessageQueue messageQueue;
public void sendMessage(...){}
public void handleMessage(){}
}
1、通过主线程给主线程发消息
Ø 消息的分类:系统消息、用户自定义消息
Ø 主线程中发消息要借助主线程Handler对象。
|-->当我们发送自定义消息时,Handler需要我们自己构建。
|-->一个线程可能关联很多个handler对象
Ø 主线程发送的消息会存储在主线程的MQ中。
Ø 主线程中的消息队列的管理者是主线程的Looper。
|-->此Looper内置一个阻塞式无限循环。
|-->此循环的目的是遍历和Looper相关联的MQ对象
|-->此Looper负责从MQ中获取消息,并将消息交给Handler。
FAQ:
1)主线程的Looper对象何时创建?系统启动时
此Looper对象创建以后会绑定到当前线程中(借助ThreadLocal)
2)主线程中的MQ何时创建?Looper对象创建时,MQ自动创建。
3)MQ自定义消息何时创建?如何创建?
|-->需要时创建。
|-->创建方法?
Message msg=Message.obtain();
Message msg=handler.obtainMessage();
4)主线程中的Handler对象何时创建?
|-->需要时创建。
|-->创建方式?
匿名内部类:new Handler(){重写HandleMessage方法}
构建handler子类
方案:在子线程中获取主线程的Handler对象
如何获取:
在主线程构建Handler对象。
在子线程中构建主线程Handler对象??
handler=new Handler(Looper.getMainLooper());
1、子线程中创建Looper的理由?
Ø 子线程中默认没有Looper对象
Ø 子线程中需要使用子线程的handler对象发送消息
2、子线程创建Looper的方式?创建Looper时自动构建MQ
Looper.prepare();//构建过程?先从当前线程取,若无则创建。创建后绑定到当前线程。
...构建handler
Looper.loop();
FAQ:
a. 子线程的handler构建时需要子线程的Looper
b. 子线程的Handler对象发送消息是发送到子线程的MQ
c. 子线程在处理消息时不能更新主线程界面。
方案:设法在主线程中获取子线程的Looper对象。
作业:
1.实现主线程给子线程发消息。
主线程给子线程发消息,子线程收到主线程数据后,更新主线程的数据(不能更新界面)。主线程通过子线程更新的数据更新界面。
2.两个子线程之间互发消息。(扩展实现)
3.使用工作线程模拟下载过程,要求带进度条。
1.四个对象
Ø Handler:在线程中发送消息
Ø MQ:消息队列,负责存储消息
Ø Message:代表一个消息对象
Ø Looper:负责发现并取出消息,交给Handler处理
2.消息的发送与处理
Ø 主线程给主线程发消息:
ü 借助主线程的Handler
Ø 主线程给子线程发消息:
ü 在主线程中获取子线程的Handler,首先要在主线程中获取子线程的Looper。
Ø 子线程发消息给主线程:
ü 要获取主线程的Handler。
ü 在主线程构建Handler。
ü 在子线程通过主线程的Looper构建Handler对象。
Ø 子线程发消息给子线程发消息
ü 子线程A发消息给子线程B(在子线程A中获取子线程B的Handler)。
1、异步任务的定义
所谓异步任务是指多个任务运行于并发的线程中
2、Android中异步任务提供了一个类:AsyncTask
我们执行耗时操作时,可以构建此类的子类对象
然后在doInBackground方法中执行耗时操作
1)AsyncTask 三个泛型参数
AsyncTask
AsyncTask < execute方法的参数, 进度, doInBackground方法的返回值 >
2)AsyncTask几个常用方法
2.1) execute 启动任务
2.2) onPreExecute() 初始化任务(运行与主线程)
2.3) doInBackground() 在工作线程执行耗时操作
2.4) onProgressUpdate 执行进度更新操作(运行与主线程)
2.5) onPostExecute()根据doInBackground方法的返回值执行界面更新操作
参考案例:
Day28_3_thread_asyn_down
Day28_3_thread_asyn_updatetitle
------------------------------------------------------------------
线程总结
--------------------------------------------------------------------------------
1、Java中的线程对象:
1) Thread
2) Runnable
3) Timer
4) Executors (....)
5) ThreadLocal (三个)
2、Android中的四个对象:
1)Handler(多个方法):发或处理
2)Looper(五个)
3)MQ (没用其中的方法)
4)Message (很多):构建消息对象,发送消息
3、一个异步任务类:AsyncTask (4个方法)
--------------------------------------------------------------------
作业:
1、总结线程的应用
2、使用异步任务和handler分别实现图片的下载
---------------------------------------------------------------------