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的消息处理机制(图+源码分析)——Looper,Handler,Message
  6. android消息处理机制学习(一)-Handler,Message,MessageQueue,Loope
  7. Android/java 多线程(六)-AsyncTask使用详解及源码分析
  8. Android 多线程之线程池
  9. Android Handler机制8之消息的取出与消息的其他操作

随机推荐

  1. android 命令大全
  2. How to install Android(安卓)SDK and pl
  3. Android横竖屏切换时,不重新onCreate()的
  4. android短信发送
  5. Hostapd Android
  6. Android(安卓)代码设置EditText过滤汉字
  7. android setAudioSource failed
  8. android ndk native_activity.h
  9. Android实现CoverFlow效果
  10. Android(安卓)v2.0 基本概念 - 浅谈