Android开发与实践线程与消息处理精选文档实用教案

上传人:cl****1 文档编号:569308873 上传时间:2024-07-28 格式:PPT 页数:34 大小:878.50KB
返回 下载 相关 举报
Android开发与实践线程与消息处理精选文档实用教案_第1页
第1页 / 共34页
Android开发与实践线程与消息处理精选文档实用教案_第2页
第2页 / 共34页
Android开发与实践线程与消息处理精选文档实用教案_第3页
第3页 / 共34页
Android开发与实践线程与消息处理精选文档实用教案_第4页
第4页 / 共34页
Android开发与实践线程与消息处理精选文档实用教案_第5页
第5页 / 共34页
点击查看更多>>
资源描述

《Android开发与实践线程与消息处理精选文档实用教案》由会员分享,可在线阅读,更多相关《Android开发与实践线程与消息处理精选文档实用教案(34页珍藏版)》请在金锄头文库上搜索。

1、16.1 多线程的实现16.2 Handler消息传递机制(jzh)16.3 综合实例多彩的霓虹灯第第1616章章线程与消息线程与消息(xio xi)(xio xi)处理处理第1页/共33页第一页,共34页。 在程序开发时,对于一些(yxi)比较耗时的操作,我们通常会为其开僻一个单独的线程来执行,这样可以尽可能减少用户的等待时间。在Android中,默认情况下,所有的操作都是在主线程中进行,这个主线程负责管理与UI相关的事件,而在我们自己创建的子线程中,又不能对UI组件进行操作,因此,Android提供了消息处理传递机制来解决这一问题。本章将对Android中如何实现多线程以及如何通过线程和消

2、息处理机制操作UI界面进行详细介绍。第第1616章章线程与消息线程与消息(xio xi)(xio xi)处理处理第2页/共33页第二页,共34页。16.1.1 创建(chungjin)线程16.1.2 开启线程16.1.3 线程的休眠16.1.4 中断线程16.1 16.1 多线程的实现多线程的实现(shxin)(shxin)第3页/共33页第三页,共34页。在Android中,提供了两种创建线程的方法(fngf),一种是通过Thread类的构造方法(fngf)创建线程对象,并重写run()方法(fngf)实现,另一种是通过实现Runnable接口实现,下面分别进行介绍。1通过Thread类的

3、构造方法(fngf)创建线程在Android中,可以使用Thread类提供的以下构造方法(fngf)来创建线程。Thread(Runnable runnable)该构造方法(fngf)的参数runnable,可以通过创建一个Runnable类的对象并重写其run()方法(fngf)来实现,例如,要创建一个名称为thread的线程,可以使用下面的代码。Thread thread=new Thread(new Runnable()/重写run()方法(fngf)Overridepublic void run() /要执行的操作);说明:在run()方法(fngf)中,可以编写要执行的操作的代码,当

4、线程被开启时,run()方法(fngf)将会被执行。16.1.1 16.1.1 创建创建(chungjin)(chungjin)线程线程第4页/共33页第四页,共34页。2通过实现Runnable接口创建线程在Android中,可以通过实现Runnable接口来创建线程。实现Runnable接口的语法格式如下:public class ClassName extends Object implements Runnable当一个类实现Runnable接口后,还需要实现其run()方法,在run()方法中,可以编写要执行的操作的代码。例如(lr),要创建一个实现了Runnable接口的Activ

5、ity,可以使用下面的代码。public class MainActivity extends Activity implements Runnable Overridepublic void onCreate(Bundle savedInstanceState) super.onCreate(savedInstanceState);setContentView(R.layout.main);Overridepublic void run() /要执行的操作第5页/共33页第五页,共34页。创建线程对象后,还需要开启(kiq)线程,线程才能执行。Thread类提供了start()方法,可以开启

6、(kiq)线程,其语法格式如下:start()例如,存在一个名称为thread的线程,如果想开启(kiq)该线程,可以使用下面的代码。thread.start();/开启(kiq)线程16.1.2 开启(kiq)线程第6页/共33页第六页,共34页。线程的休眠就是让线程暂停多长时间后再次执行。同Java一样(yyng),在Android中,也可以使用Thread类的sleep()方法,让线程休眠指定的时间。sleep()方法的语法格式如下:sleep(long time)其中的参数time用于指定休眠的时间,单位为毫秒。例如,想要线程休眠1秒钟,可以使用下面的代码。Thread.sleep(1

7、000);16.1.3 线程的休眠(ximin)第7页/共33页第七页,共34页。当需要中断指定线程时,可以使用Thread类提供的interrupt()方法来实现。使用interrupt()方法可以向指定的线程发送一个中断请求,并将该线程标记为中断状态。interrupt()方法的语法格式如下:interrupt()例如,存在一个名称为thread的线程,如果想中断该线程,可以使用下面的代码(di m)。/省略部分代码(di m)thread.interrupt();/省略部分代码(di m)public void run() while(!Thread.currentThread().is

8、Interrupted()/省略部分代码(di m)另外,由于当线程执行wait()、join()或者sleep()方法时,线程的中断状态将被清除,并且抛出InterruptedException,所以,如果在线程中执行了wait()、join()或者sleep()方法,那么,想要中断线程时,就需要使用16.1.4 中断(zhngdun)线程第8页/共33页第八页,共34页。一个boolean型的标记变量(binling)来记录线程的中断状态,并通过该标记变量(binling)来控制循环的执行与停止。例如,通过名称为isInterrupt的boolean型变量(binling)来标记线程的中断

9、,关键代码如下:private boolean isInterrupt=false;/定义一下标记变量(binling) /省略部分代码/在需要中断线程时,将isInterrupt的值设置为truepublic void run() while(!isInterrupt)/省略部分代码【例16-1】 在Eclipse中创建Android项目,通过实现Runnable接口来创建线程、开启线程、让线程休眠指定时间和中断线程。(实例位置:光盘MR源码第16章16-1)(1)修改新建项目的res/layout目录下的布局文件main.xml,将默认添加第9页/共33页第九页,共34页。的TextVie

10、w组件删除,然后在默认添加的线性布局管理器中添加两个按钮,一个用于开启线程,另一个用于中断线程。(2)打开默认添加的MainActivity,让该类实现Runnable接口,修改(xigi)后的创建类的代码如下:public class MainActivity extends Activity implements Runnable (3)实现Runnable接口中的run()方法,在该方法中,判断当前线程是否被中断,如果没有被中断,则将循环变量+1,并在日志中输出循环变量的值,具体代码如下:Overridepublic void run() while (!Thread.currentTh

11、read().isInterrupted() i+;Log.i(循环变量:, String.valueOf(i);(4)在该MainActivity中,创建两个成员变量,具体代码如下:private Thread thread;/声明线程对象int i; /循环变量第10页/共33页第十页,共34页。(5)在onCreate()方法中,首先获取布局管理器中添加(tin ji)的“开始”按钮,然后为该按钮添加(tin ji)单击事件监听器,在重写的onCreate()方法中,根据当前Activity创建一个线程,并开启该线程,具体代码如下:Button startButton = (Button

12、) findViewById(R.id.button1); / 获取“开始”按钮startButton.setOnClickListener(new OnClickListener() Overridepublic void onClick(View v) i = 0;thread = new Thread(MainActivity.this); / 创建一个线程thread.start(); / 开启线程);(6)获取布局管理器中添加(tin ji)的“停止”按钮,并为其添加(tin ji)单击事件监听器,在重写的onCreate()方法中,如果thread对象不为空,则中断线程,并向日志中

13、输出提示信息,具体代码如下:Button stopButton = (Button) findViewById(R.id.button2); / 获取“停止”按钮stopButton.setOnClickListener(new OnClickListener() Override第11页/共33页第十一页,共34页。public void onClick(View v) if (thread != null) thread.interrupt(); / 中断线程thread = null;Log.i(提示:, 中断线程););(7)重写MainActivity的onDestroy()方法(f

14、ngf),在该方法(fngf)中,中断线程,具体代码如下:Overrideprotected void onDestroy() if (thread != null) thread.interrupt(); / 中断线程thread = null;super.onDestroy();第12页/共33页第十二页,共34页。运行本实例,在屏幕上将显示一个(y )“开始”按钮和一个(y )“停止”按钮,单击“开始”按钮后,将在日志面板中输出循环变量的值,单击“停止”按钮,将中断线程。日志面板的显示结果如图16-1所示。图16-1 在日志面板中输出的内容第13页/共33页第十三页,共34页。16.2.

15、1 循环(xnhun)者Looper简介16.2.2 消息处理类Handler简介16.2.3 消息类Message简介16.2 Handler16.2 Handler消息传递机制消息传递机制(jzh)(jzh)第14页/共33页第十四页,共34页。 Android中引入Handler消息传递机制,用来实现在新创建的线程中操作(cozu)UI界面,本节将对Handler消息传递机制进行介绍。16.2 Handler消息传递机制(jzh)第15页/共33页第十五页,共34页。 在介绍Lopper之前,需要先来了解另一个概念,那就是MessageQueue。在Android中,一个线程对应一个Lo

16、oper对象,而一个Looper对象又对应一个MessageQueue(消息队列)。MessageQueue用于存放(cnfng)Message(消息),在MessageQueue中,存放(cnfng)的消息按照FIFO(先进先出)原则执行,由于MessageQueue被封装到Looper里面了,所以这里不对MessageQueue进行过多介绍。Looper对象用来为一个线程开启一个消息循环,用来操作MessageQueue。默认情况下Android中新创建的线程是没有开启消息循环的。但是主线程除外,系统为自动为主线程创建Looper对象,开启消息循环。所以,当我们在主线程中,应用下面的代码创

17、建Handler对象时,就不会出错,而如果在新创建的非主线程中,应用下面的代码创建Handler对象时,将产生如图16-2所示的异常信息。Handler handler2 = new Handler();16.2.1 循环(xnhun)者Looper简介第16页/共33页第十六页,共34页。图16-2 在非主线程中创建Handler对象产生的异常信息如果想要在非主线程中,创建Handler对象,首先需要使用Looper类的prepare()方法来初始化一个Looper对象,然后创建这个Handler对象,再使用Looper类的loop()方法,启动(qdng)Looper,从消息队列里获取和处

18、理消息。【例16-2】 在Eclipse中创建Android项目,创建一个继承了Thread类的LooperThread,并在重写的run()方法中,创建一个Handler对象发送并处理消息。(实例位置:光盘MR源码第16章16-2)(1)创建一个继承了Thread类的LooperThread,并在重写的run()方法中,创建一个Handler对象发送并处理消息,关键代码如下:public class LooperThread extends Thread public Handler handler1;/ 声明一个Handler对象第17页/共33页第十七页,共34页。Overridepub

19、lic void run() super.run();Looper.prepare();/ 初始化Looper对象 / 实例化一个Handler对象 handler1 = new Handler() public void handleMessage(Message msg) Log.i(Looper,String.valueOf(msg.what); ;Message m=handler1.obtainMessage();/ 获取一个消息m.what=0x11;/ 设置Message的what属性的值handler1.sendMessage(m);/ 发送(f sn)消息Looper.loo

20、p();/ 启动Looper第18页/共33页第十八页,共34页。(2 2)在)在MainActivityMainActivity的的onCreate()onCreate()方法中,创建一个方法中,创建一个LooperThreadLooperThread线程,并开启线程,并开启该线程,关键代码如下该线程,关键代码如下(rxi)(rxi):LooperThread thread=new LooperThread();LooperThread thread=new LooperThread();/创建一个线创建一个线程程thread.start();thread.start();/开启线程开启线程

21、运行本实例,在日志面板(运行本实例,在日志面板(LogCatLogCat)中输出如图)中输出如图16-316-3所示的内容。所示的内容。图图16-3 16-3 在日志面板(在日志面板(LogCatLogCat)中输出的内容)中输出的内容LooperLooper类提供的常用方法如表类提供的常用方法如表16-116-1所示。所示。表表16-1 Looper16-1 Looper类提供的常用方法类提供的常用方法方 法描 述prepare()用于初始化Looperloop()调用loop()方法后,Looper线程就开始真正工作了,它会从消息队列里获取消息和处理消息myLooper()可以获取当前线程

22、的Looper对象getThread()用于获取Looper对象所属的线程quit()用于结束Looper循环第19页/共33页第十九页,共34页。注意:注意:写在写在Looper.loop()Looper.loop()之后的代码不会被执行,这个函数内部是一个循环之后的代码不会被执行,这个函数内部是一个循环(xnhun)(xnhun),当调用,当调用Handler.getLooper().quitHandler.getLooper().quit()()方法后,方法后,loop()loop()方法才会中止,其后面的代码才能得以运行。方法才会中止,其后面的代码才能得以运行。第20页/共33页第二十

23、页,共34页。16.2.2 消息(xio xi)处理类Handler简介消息处理类(Handler)允许发送和处理Message或Rannable对象到其所在线程的MessageQueue中。Handler有以下两个主要作用(zuyng):(1)将Message或Runnable应用post()方法或sendMessage()方法发送到Message Queue中,在发送时可以指定延迟时间、发送时间或者要携带的Bundle数据。当MessageQueue循环到该Message时,调用相应的Handler对象的handlerMessage()方法对其进行处理。(2)在子线程中与主线程进行通信,也

24、就是在工作线程中与UI线程进行通信。说明:在一个线程中,只能一个Looper和MessageQueue,但是,可以有多个Handler,而且这些Handler可以共享同一个Looper和MessageQueue。Handler类提供的常用的发送和处理消息的方法如表16-2所示。表16-2 Handler类提供的常用方法第21页/共33页第二十一页,共34页。方 法描 述handleMessage(Messagemsg)处理消息的方法。通常重写该方法来处理消息,在发送消息时,该方法会自动回调post(Runnabler)立即发送Runnable对象,该Runnable对象最后将被封装成Messa

25、ge对象postAtTime(Runnabler,longuptimeMillis)定时发送Runnable对象,该Runnable对象最后将被封装成Message对象postDelayed(Runnabler,longdelayMillis)延迟多少毫秒发送Runnable对象,该Runnable对象最后将被封装成Message对象sendEmptyMessage(intwhat)发送空消息sendMessage(Messagemsg)立即发送消息sendMessageAtTime(Messagemsg,longuptimeMillis)定时发送消息sendMessageDelayed(Me

26、ssagemsg,longdelayMillis)延迟多少毫秒发送消息第22页/共33页第二十二页,共34页。16.2.3 消息(xio xi)类Message简介消息类(消息类(MessageMessage)被存放在)被存放在MessageQueueMessageQueue中,一个中,一个(y )MessageQueue(y )MessageQueue中可以包含中可以包含多个多个MessageMessage对象。每个对象。每个MessageMessage对象可以通过对象可以通过Message.obtain()Message.obtain()方法或者方法或者Handler.obtainMess

27、ageHandler.obtainMessage()()方法获得。一个方法获得。一个(y )Message(y )Message对象具有如表对象具有如表16-316-3所示的所示的5 5个属性。个属性。表表16-3 Message16-3 Message类的属性类的属性说明:说明:使用使用MessageMessage类的属性可以携带类的属性可以携带intint型和数据,如果要携带其他类型的数据,可以先将型和数据,如果要携带其他类型的数据,可以先将要携带的数据保存到要携带的数据保存到BundleBundle对象中,然后通过对象中,然后通过MessageMessage类的类的setDate()se

28、tDate()方法将其添加到方法将其添加到MessageMessage中。中。属 性类 型描 述arg1int用来存放整型数据arg2int用来存放整型数据objObject用来存放发送给接收器的Object类型的任意对象replyToMessenger用来指定此Message发送到何处的可选Messager对象whatint用于指定用户自定义的消息代码,这样接收者可以了解这个消息的信息第23页/共33页第二十三页,共34页。综上所述,综上所述,MessageMessage类的使用方法类的使用方法(fngf)(fngf)比较简单,只要在使用它时,注意以下比较简单,只要在使用它时,注意以下3 3

29、点点即可:即可:尽管尽管MessageMessage有有publicpublic的默认构造方法的默认构造方法(fngf)(fngf),但是通常情况下,需要使用,但是通常情况下,需要使用Message.obtainMessage.obtain()()方法方法(fngf)(fngf)或或Handler.obtainMessage()Handler.obtainMessage()方法方法(fngf)(fngf)来从消息池中获得空消息对来从消息池中获得空消息对象,以节省资源。象,以节省资源。如果一个如果一个MessageMessage只需要携带简单的只需要携带简单的intint型信息,应优先使用型信息

30、,应优先使用Message.arg1Message.arg1和和Message.arg2Message.arg2属性来传递信息,这比用属性来传递信息,这比用BundleBundle更省内存。更省内存。尽可能使用尽可能使用Message.whatMessage.what来标识信息,以便用不同方式处理来标识信息,以便用不同方式处理MessageMessage。第24页/共33页第二十四页,共34页。 本实例本实例(shl)(shl)要求在要求在AndroidAndroid程序中实现多彩霓虹灯的效果,运行程序,将在程序中实现多彩霓虹灯的效果,运行程序,将在AndroidAndroid窗口中显示一个多

31、彩的霓虹灯,它可以不断的变换颜色,如图窗口中显示一个多彩的霓虹灯,它可以不断的变换颜色,如图16-416-4所示。所示。图图16-4 16-4 多彩的霓虹灯多彩的霓虹灯程序开发步骤如下:程序开发步骤如下:(1 1)修改新建项目的)修改新建项目的res/layoutres/layout目录下的布局文件目录下的布局文件main.xmlmain.xml,将默认添加的,将默认添加的TextViewTextView组件删除,并为默认添加的线性布局管理器设置组件删除,并为默认添加的线性布局管理器设置IDID属性。属性。16.3 综合(zngh)实例多彩的霓虹灯第25页/共33页第二十五页,共34页。(2

32、2)在)在res/values/res/values/目录下,创建一个保存颜色资源的目录下,创建一个保存颜色资源的colors.xmlcolors.xml文件,在该文件中,文件,在该文件中,定义定义7 7个颜色资源,名称依次为个颜色资源,名称依次为color1color1、color2color2、color7color7;颜色值分别为代表赤、;颜色值分别为代表赤、橙、黄、绿、青、蓝、紫所对应的颜色值。橙、黄、绿、青、蓝、紫所对应的颜色值。colors.xmlcolors.xml文件的关键代码如下:文件的关键代码如下: #ffff0000 #ffff0000 #ffff6600 #ffff66

33、00 #ffffff00 #ffffff00 #ff00ff00 #ff00ff00 #ff00ffff #ff00ffff #ff0000ff #ff0000ff #ff6600ff #ff6600ff(3 3)在该)在该MainActivityMainActivity中,声明程序中所需的成员变量,具体代码如下:中,声明程序中所需的成员变量,具体代码如下:private Handler handler;private Handler handler;/创建创建HandlerHandler对象对象private static LinearLayout linearLayout; private

34、 static LinearLayout linearLayout; / / 整体整体(zhngt)(zhngt)布局布局public static TextView tv = new TextView14; public static TextView tv = new TextView14; /第26页/共33页第二十六页,共34页。TextViewTextView数组数组/使用颜色资源使用颜色资源(zyun)(zyun)int bgColor=new intR.color.color1,R.color.color2,R.color.color3,int bgColor=new intR.

35、color.color1,R.color.color2,R.color.color3,R.color.color4,R.color.color5,R.color.color6,R.color.color7;R.color.color4,R.color.color5,R.color.color6,R.color.color7;private int index=0;private int index=0;/当前颜色值当前颜色值(4 4)在)在MainActivityMainActivity的的onCreate()onCreate()方法中,首先获取线程布局管理器,然后获取屏幕的高度,接下来再通过

36、一个方法中,首先获取线程布局管理器,然后获取屏幕的高度,接下来再通过一个forfor循环创建循环创建1414个文本框组件,并添加到线性布局管理器中,具体代码如下:个文本框组件,并添加到线性布局管理器中,具体代码如下:linearLayout=(LinearLayout)findViewById(R.id.ll);linearLayout=(LinearLayout)findViewById(R.id.ll); /获取线性布局管获取线性布局管理器理器int height=this.getResources().getDisplayMetrics().heightPixels;int height

37、=this.getResources().getDisplayMetrics().heightPixels;/获取屏幕的高度获取屏幕的高度for(int i=0;itv.length;i+)for(int i=0;itv.length;i+)tvi=new TextView(this);tvi=new TextView(this);/创建一个文本框对象创建一个文本框对象tvi.setWidth(this.getResources().getDisplayMetrics().widthPixels);tvi.setWidth(this.getResources().getDisplayMetri

38、cs().widthPixels);/设置文本框宽度设置文本框宽度tvi.setHeight(height/tv.length);tvi.setHeight(height/tv.length); 第27页/共33页第二十七页,共34页。/为设置文本框高度为设置文本框高度linearLayout.addView(tvi);linearLayout.addView(tvi);/将将TextViewTextView组件组件添加到线性布局管理器中添加到线性布局管理器中 (5 5)创建并开启一个新线程,在重写的)创建并开启一个新线程,在重写的run()run()方法中,实现一个循环,在该循环中,首先获取

39、一个方法中,实现一个循环,在该循环中,首先获取一个MessageMessage对象,对象,并为其设置一个消息标识并为其设置一个消息标识(biozh)(biozh),然后发送消息,最后让线程休眠,然后发送消息,最后让线程休眠1 1秒钟,具体代码如下:秒钟,具体代码如下:Thread t = new Thread(new Runnable()Thread t = new Thread(new Runnable()OverrideOverridepublic void run() public void run() while (!Thread.currentThread().isInterrupt

40、ed() while (!Thread.currentThread().isInterrupted() Message m = handler.obtainMessage();Message m = handler.obtainMessage();/获取一个获取一个MessageMessagem.what=0x101;m.what=0x101;/设置消息标识设置消息标识(biozh)(biozh)handler.sendMessage(m);handler.sendMessage(m);/发送消息发送消息try try Thread.sleep(new Random().nextInt(100

41、0);Thread.sleep(new Random().nextInt(1000);/休眠休眠1 1秒钟秒钟第28页/共33页第二十八页,共34页。 catch (InterruptedException e) catch (InterruptedException e) e.printStackTrace();e.printStackTrace();/输出异常信息输出异常信息 ););t.start(); t.start(); / / 开启线程开启线程(6 6)创建一个)创建一个HandlerHandler对象,在重写的对象,在重写的handleMessage()handleMessage

42、()方法方法(fngf)(fngf)中,为每个文本框设置背景颜色,该中,为每个文本框设置背景颜色,该背景颜色从颜色数组中随机获取,具体代码如下:背景颜色从颜色数组中随机获取,具体代码如下:handler = new Handler() handler = new Handler() OverrideOverridepublic void handleMessage(Message msg) public void handleMessage(Message msg) int temp=0;int temp=0;/临时变量临时变量if (msg.what = 0x101) if (msg.wha

43、t = 0x101) for(int i=0;itv.length;i+)for(int i=0;itv.length;i+)temp=new Random().nextInt(bgColor.length);temp=new Random().nextInt(bgColor.length);/产生一个随机数产生一个随机数第29页/共33页第二十九页,共34页。/去掉重复的并且相邻的颜色去掉重复的并且相邻的颜色if(index=temp)if(index=temp)temp+;temp+;if(temp=bgColor.length)if(temp=bgColor.length)temp=0;

44、temp=0; index=temp;index=temp;/为文本框设置背景为文本框设置背景tvi.setBackgroundColor(getResources().getColor(bgColorindex);tvi.setBackgroundColor(getResources().getColor(bgColorindex); super.handleMessage(msg);super.handleMessage(msg); ;(7 7)在)在AndroidManifest.xmlAndroidManifest.xml文件文件(wnjin)(wnjin)的的标记中,设置标记中,设置

45、android:themeandroid:theme属性,实现全屏显示,关键代码属性,实现全屏显示,关键代码如下:如下:android:theme=android:style/Theme.Black.NoTitleBarandroid:theme=android:style/Theme.Black.NoTitleBar第30页/共33页第三十页,共34页。(1)在现实生活中,很多事情都是同时进行的,例如,我们可以一边看书,一边喝咖啡。而计算机则可以一边播放音乐,一边打印文档。对于这种可以同时进行的任务,我们可以用线程来表示,每个线程完成一个任务,并与其他线程同时执行,这种机制被称为多线程。(2

46、)线程的休眠就是让线程暂停多长时间后再次执行。(3)MessageQueue用于存放Message(消息),在MessageQueue中,存放的消息按照FIFO(先进先出)原则执行,MessageQueue被封装到Looper里面了。(4)Looper对象用来(yn li)为一个线程开启一个消息循环,用来(yn li)操作MessageQueue。默认情况下Android中新创建的线程是没有开启消息循环的。(5)消息处理类(Handler)允许发送和处理Message或Rannable对象到其所在线程的MessageQueue中。(6)消息类(Message)被存放在MessageQueue中

47、,一个MessageQueue中可以包含多个Message对象。每个Message对象可以通过Message.obtain()方法或者Handler.obtainMessage()方法获得。知识点提炼(tlin)第31页/共33页第三十一页,共34页。16-1 在Android程序中创建线程有几种方法,分别是什么(shn me)?16-2 休眠线程需要用到Thread类的哪个方法?16-3 如何中断一个线程?16-4 怎样中断线程?16-5 简单描述消息传递机制用到的几个主要类。习题(xt)第32页/共33页第三十二页,共34页。感谢您的观赏(gunshng)!第33页/共33页第三十三页,共34页。内容(nirng)总结16.1 多线程的实现。本章将对Android中如何实现多线程以及如何通过(tnggu)线程和消息处理机制操作UI界面进行详细介绍。第16页/共33页。消息处理类(Handler)允许发送和处理Message或Rannable对象到其所在线程的MessageQueue中。而计算机则可以一边播放音乐,一边打印文档。第32页/共33页。感谢您的观赏。第33页/共33页第三十四页,共34页。

展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 高等教育 > 研究生课件

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号