您的位置:首页 > 移动开发 > Android开发

android中线程的应用

2016-05-01 21:37 246 查看

android中线程的应用

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());

子线程如何创建Looper对象

1、子线程中创建Looper的理由?

Ø 子线程中默认没有Looper对象

Ø 子线程中需要使用子线程的handler对象发送消息

2、子线程创建Looper的方式?创建Looper时自动构建MQ

Looper.prepare();//构建过程?先从当前线程取,若无则创建。创建后绑定到当前线程。

...构建handler

Looper.loop();

FAQ:

a. 子线程的handler构建时需要子线程的Looper

b. 子线程的Handler对象发送消息是发送到子线程的MQ

c. 子线程在处理消息时不能更新主线程界面。

主线程如何获取子线程的Handler对象

方案:设法在主线程中获取子线程的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<Params,Progress,Result>

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分别实现图片的下载

---------------------------------------------------------------------
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: