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中获取子线程BHandler)。   

线程中异步任务

1、异步任务的定义

 

所谓异步任务是指多个任务运行于并发的线程中

 

2Android中异步任务提供了一个类: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

 

------------------------------------------------------------------

线程总结

--------------------------------------------------------------------------------

1Java中的线程对象:

 

1) Thread

2) Runnable

3) Timer

4) Executors ....

5) ThreadLocal  (三个)

 

2Android中的四个对象:

 

1)Handler(多个方法):发或处理

2)Looper(五个)

3)MQ  (没用其中的方法)

4)Message (很多):构建消息对象,发送消息

 

3、一个异步任务类:AsyncTask (4个方法)

--------------------------------------------------------------------

 

作业:

1、总结线程的应用

2、使用异步任务和handler分别实现图片的下载

---------------------------------------------------------------------

 

更多相关文章

  1. android消息机制
  2. Android进程与线程基本知识
  3. 浅析Android单线程模型
  4. Android(安卓)多线程之几个基本问题
  5. Android异步处理三:Handler+Looper+MessageQueue深入详解
  6. 【NFC在android中的应用API】
  7. android的消息处理机制(图+源码分析)——Looper,Handler,Message
  8. Android(安卓)性能优化的一些方法
  9. 【Android】性能优化的一些方法

随机推荐

  1. Android(安卓)中 Activity的内存泄漏,原因
  2. Android(安卓)Studio错误代码不提示问题
  3. android中实现暗码启动apk【一】
  4. 十年一顾,iOS与Android这样改变了我们
  5. 混合开发H5页面嵌入ios/Android及echarts
  6. Android中的第一个NDK的例子
  7. 10个最佳Android新闻应用模板
  8. 在Android图片缓存
  9. ListView分页加载数据
  10. Android(安卓)NDK开发之Jni调用Java对象