Andr移动终端基础开发 7_第1页
Andr移动终端基础开发 7_第2页
Andr移动终端基础开发 7_第3页
Andr移动终端基础开发 7_第4页
Andr移动终端基础开发 7_第5页
已阅读5页,还剩25页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

移动终端应用开发校园易App娱乐功能实现ANDROID目录Contents认识Android多线程设计乒乓球对打游戏设计消灭害虫游戏教学目标知识目标掌握Android线程的概念。理解Handler通信机制。掌握主线程和子线程通信方法。掌握利用Handler实现多线程通信的方法。技能目标能够在Android中创建线程。能够利用Handler实现Android多线程通信。素质目标培养团队协作和资源整合能力。培养热爱奉献的人生态度

。创新意识与持续学习能力。认识Android多线程01PART认识线程在现实生活中,有时只做某一件事情,如看书;而有时会同时进行多件事件,如一边看书一边喝茶。在Android中,一个App可以单独运行单个功能,如记事本功能;一个App也可以同时运行多个功能,如使用微信时可以一边浏览朋友圈一边拨打微信电话,这种在一个App中多个任务同时运行的功能可以用多个线程来实现。进程是系统能够进行运算调度的基本单位。一个Android应用程序在内存中运行后就是一个进程,可以说程序是“死”的,进程是“活”的。线程(Thread)是系统能够进行运算调度的最小单位,其包含在进程中,是进程中的实际运作的单位,是进程中具有单一顺序的控制流。多线程指在一个进程中可以并发执行多个线程,通过提高资源使用效率来提高系统效率,如微信进程包含播放语音的线程、接收消息的线程、下载视频的线程等。认识线程1.创建线程Android提供了线程类Thread来创建线程的程序。实际上,创建线程与创建普通类的对象操作是一样的,线程就是Thread类或者其子类的实例化对象,每个Thread对象描述了一个单独的线程。方法一:继承Thread类,重写Thread类的run()方法。classChildThreadextendsThread{//继承Thread类@Overridepublicvoidrun(){//在此处写入线程要进行的操作Toast.makeText(MainActivity.this,"我是子线程!",1).show();}}启动线程的方法:在线程Thread类中提供了一个start()方法,用于启动新线程。线程启动后,会自动调用run()方法。ChildThreadmyThread=newChildThread();//创建线程对象New

myThread().start();//通过调用start()方法启动线程认识线程方法二:实现Runnable接口,重载Runnable接口中的run()方法。classChildThreadimplementsRunnable{ //实现Runnable接口

@Overridepublicvoidrun(){//在此处写入线程要进行的操作

Toast.makeText(MainActivity.this,"我是子线程!",1).show();}}启动线程的方法:同样通过start()方法启动新线程。线程启动后,会自动调用run()方法。ChildThreadmyThread=newChildThread(); //创建ChildThread的实例对象Threadthread=newThread(myThread); //创建线程对象thread.start();//通过调用start()方法启动线程认识线程【案例5-1】假设火车站售票厅有4个窗口同时售卖某次列车的100张车票,这100张火车票可以被看作共享资源,4个窗口可以创建4个线程来实现同时售票功能。方法一:通过继承Thread类,并重载其run()方法,将售票结果输出到Logcat窗口中。方法二:实现Runnable接口,重载Runnable接口中的run()方法,将售票结果输出到Logcat窗口中。认识线程2.线程的生命周期线程的生命周期认识线程3.线程休眠在Android中有时会人为地让线程休眠,即暂停一段时间再运行,将CPU让给其他线程。此时可以调用Thread类中的sleep()方法实现,其基本语法格式如下。sleep(longtime);【案例5-2】龟兔赛跑。要求编程实现模拟龟兔赛跑,假设全程跑800米,乌龟的速度为1米/0.05秒,兔子的速度为1米/0.01毫秒,兔子跑到700米时得意地睡了40秒,结果乌龟赢得了比赛。主要实现步骤如下。①创建一个Torist线程类作为乌龟,在Torist类中使用sleep()方法模拟乌龟跑步速度,利用while循环实现跑步。②创建一个Rabbit线程类作为兔子,在Rabbit类中使用sleep()方法模拟兔子跑步速度,利用while循环实现跑步,到达700米时,兔子睡觉40000毫秒。③在主线程中创建并启动Torist和Rabbit线程,实现龟兔赛跑。认识线程4.线程优先级在应用程序中,如果要对线程进行调度,那么最直接的方法就是设置线程的优先级,优先级越高的线程获得CPU使用权的机会越大。线程优先级分为10个级别,可以使用整数1~10来表示,也可以使用Thread类的3个静态常量表示,具体如下。Thread.MIN_PRIORITY //优先级为1,最低优先级Thread.MAX_PRIORITY //优先级为10,最高优先级Thread.NORM_PRIORITY //优先级为5,普通优先级程序运行期间,处于就绪状态的线程都有自己的优先级。然而,线程优先级不是固定不变的,可以通过Thread类的setPriority(intgrade)进行优先级设置,其中grade是整数1~10或者Thread类的3个静态常量,线程默认的优先级是5。认识线程5.线程中断errupt()方法的作用是中断线程,其会设置该线程的中断标志位为true,线程是死亡、等待新的任务还是继续运行至下一步,取决于该程序本身。线程会不时地检测该中断标志位,以判断线程是否应该被中断(中断标志位的值是否为true)。例如,存在一个名为thread的线程,如果想中断该线程,则可以使用如下代码。… //省略部分代码errupt(); //thread线程被中断… //省略部分代码publicvoidrun(){while(!Thread.currentThread().isInterrupted()){//线程检测中断标志位,判断其是否被中断… //线程没有被中断时可以执行的代码}}掌握Handler通信机制1.Message类Message对象内部使用链表数据结构存储多个消息(最大的长度为50),目的是可以重用Message对象,减少每次创建Message对象时产生的垃圾对象数量。属性类型描述arg1int存放整型数据arg2int存放整型数据

objObject存放发送给接收者的Object类型的任意对象replyToMessenger指定此消息发送到何处whatint指定用户自定义的消息代码,这样接收者可以了解该消息的信息掌握Handler通信机制2.Handler通信机制的角色及流程Handler通信过程中涉及如下相关类。①Message:消息,其包含消息代码、消息处理对象及处理的数据等,由MessageQueue统一列队,最终由Handler处理。②Handler:处理者,负责消息的发送及处理。使用Handler时,需要实现handleMessage(Messagemsg)方法来对特定的消息进行处理,如更新UI等。③MessageQueue:消息队列,用来存放Handler发送过来的消息,并按照先进先出规则执行。当然,存放消息并非实际意义上的保存,而是将消息以链表的方式串联起来,等待Looper的提取。④Looper:消息泵,不断地从MessageQueue中抽取消息并执行。因此,一个MessageQueue需要一个Looper。⑤Thread:线程,负责调度整个消息循环,即消息循环的执行场所。UI线程通常就是主线程,而Android启动程序时会替其建立一个MessageQueue。掌握Handler通信机制要使用Handler实现消息处理,需要先创建一个Handler对象并重写handleMessage()方法,再创建一个Message对象,并利用Handler将此消息发送出去,随即该消息会被添加到MessageQueue中。Looper会一直从MessageQueue中取出待处理的消息,将其分发回handleMessage()方法中,由此实现了Handler通信。Handler通信机制掌握Handler通信机制3.Handler通信的三个步骤利用Handler实现通信主要有三个步骤:消息发送、消息接收和消息处理。(1)Handler消息发送方法针对Handler通信,Android提供了一系列方法实现消息发送。方法描述sendEmptyMessage(intwhat)发送空消息sendMessage(Messagemsg)立即发送消息sendMessageAtTime(Messagemsg,longuptimeMillis)定时发送消息sendMessageDelayed(Messagemsg,longdelayMillis)延迟多少毫秒发送消息掌握Handler通信机制3.Handler通信的三个步骤利用Handler实现通信主要有三个步骤:消息发送、消息接收和消息处理。(1)Handler消息发送方法针对Handler通信,Android提供了一系列方法实现消息发送。方法描述sendEmptyMessage(intwhat)发送空消息sendMessage(Messagemsg)立即发送消息sendMessageAtTime(Messagemsg,longuptimeMillis)定时发送消息sendMessageDelayed(Messagemsg,longdelayMillis)延迟多少毫秒发送消息(2)Handler消息接收方法掌握Handler通信机制(3)Handler消息处理方法自动接收消息后,Android会自动调用handleMessage()方法来处理消息。Handler接收消息常用方法如表所示,需要把消息接收后要进行的操作写在handleMessage()方法体中。方法描述handleMessage(Messagemsg)处理消息的方法。通常重写该方法来处理消息,在发送消息时,该方法会自动被系统回调具体的Handler消息接收及处理的代码如下。myhandler=newHandler(){//创建Handler对象@OverridepublicvoidhandleMessage(Messagemsg){super.handleMessage(msg);//接收消息,以及接收消息后要进行的操作}};掌握Handler通信机制【案例5-3】发送元旦礼物。元旦到来时,人们可能会收到元旦礼物,利用Handler模拟快递员发送礼物包裹,利用Message模拟客户签收礼物包裹。元旦礼物效果设计乒乓球对打游戏02PART分析乒乓球对打游戏动画效果是由图片一帧一帧按照时间间隔切换得到的,乒乓球对打游戏也是由多幅图片按时间间隔延时切换展示并不断循环实现的。乒乓球对打游戏实现思路分析乒乓球对打游戏(1)子线程实现延时操作默认情况下,Android在程序启动时会自动启动一条主线程,所有组件的操作都是在主线程中完成的,包括响应用户的触摸、系统组件生命周期方法的调用、UI的更新等。用户随时会与界面发生交互,主线程需要任何时候都保持很快的响应速度,因此主线程中不允许处理一些耗时的操作(如网络连接、大数据访问和运算等),如果阻塞时间达到5秒,程序就会处于应用程序不响应(ApplicationNotResponse,ANR)状态。因此,需要手动创建线程来实现延时操作,即延时1秒需要交给子线程实现。分析乒乓球对打游戏(2)主线程实现UI更新操作Android开发中规定,为使UI操作是线程安全的,只有主线程可以更新Activity的组件。如果强行在子线程中更新Activity的组件,则Android会抛出子线程更新UI异常。子线程更新UI异常乒乓球对打游戏的程序流程分析乒乓球对打游戏(3)Handler实现主线程和子线程通信要使用Handler实现异步消息处理,需要在主线程中创建一个Handler对象并重写handleMessage()方法。当子线程中需要进行UI操作时,可创建一个Message对象,并利用Handler将此消息发送出去,随即该消息会被添加到MessageQueue中。Looper会一直从MessageQueue中取出待处理的消息,将其分发回handleMessage()方法中。Handler对象是在主线程中创建的,在子线程中利用Handler对象发送消息,在主线程中调用handleMessage()方法处理消息,由此实现了主线程和子线程的通信。【案例5-4】实现乒乓球对打游戏。分析乒乓球对打游戏【案例5-4】实现乒乓球对打游戏。乒乓球

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论