浅析安卓开发中的多线程
2016-10-21张旭辉
张旭辉
【关键词】多线程 消息 AsyncTask类
1 引言
随着移动平台走入人们的视野,移动平台的开发越来越为大家所熟悉,而多线程作为安卓开发中非常重要部分,在很多应用程序都是不可或缺的。
2 线程的概念
2.1 进程与线程
进程的概念想必大家都比较熟悉,一个进程就是一个执行中的程序,而每一个进程都有自己独立的内存空间、系统资源,每一个进程的内部数据和状态都是完全独立的。
与进程相同的是,线程也是一段具有某个特定功能的代码,是单个顺序的流控制。但不同的是,同类的多个线程共享内存空间和系统资源,所以系统在线程之间切换时,占用资源比进程小,因此线程也被称为轻量级进程。
多线程指的是在单个程序中可以同时运行多个不同的线程,以执行不同的功能。这使得一个程序的多行语句看上去好像在同时运行。
2.2 实现线程的两种方式
当一个安卓程序第一次启动时,会默认启动一个主线程,在主线程中主要负责处理与UI相关的事件,包括屏幕绘制、事件响应等,并把相关的事件分发到对应的组件进行处理。因此主线程通常又被叫做UI线程。
在Java中若想新增线程主要通过两种方式:一是继承Thread类,一是实现Runnable接口,无论是哪种方式,都将实现线程的核心方法run,通常将需要线程处理的事情都放在run方法中,当启动线程时会自动调用run方法。
3 安卓开发中的多线程
3.1 Thread+Handler+Message结构
我们以实现Runnable接口的方式定义线程类,代码如下。
执行如上代码时并不能实现我们想要的效果,反而会发生异常使程序崩溃退出。这是因为在安卓中若想更新UI则必须由创建它的线程来完成。由于我们在程序中创建了新的线程,所以程序中就存在主线程和子线程。主线程的职责是创建、显示和更新UI控件、处理UI事件、启动子线程,而子线程则负责计算时间以及向主线程发出更新UI消息,而不是直接更新UI。但问题是子线程和主线程如何通信呢?在Android中提供了Message作為消息的载体,线程将一个个的消息加入到消息队列中,Android中又提供了Handler类来对消息进行处理,例如修改UI就可以在Handler中实现。
在线程类中将修改UI改为发送消息。
hand.sendMessage(msg); //发送消息,hand为自定义的Handler类对象
3.2 AsyncTask类
为了能够实现多线程,Android提供了AsyncTask类,AsyncTask类中包括如下方法。
3.2.1 onPreExecute()
在线程被调用后立即执行,一般用来在执行后台任务前对UI做一些初始化。
3.2.2 doInBackground(Params... params)
在onPreExecute()完成后立即执行,用于执行较为复杂的操作,此方法将接收输入参数和返回计算结果。在执行过程中可以调用publishProgress(Progress... values)来更新进度信息。
3.2.3 onProgressUpdate(Progress... values)
在调用publishProgress(Progress... values)时,此方法被执行,直接将进度信息更新到UI组件上。
3.2.4 onPostExecute(Result result)
当后台操作结束时,此方法将会被调用,计算结果将做为参数传递到此方法中,直接将结果显示到UI组件上。
所有方法均不需要手动调用,其中doInBackground(Params... params)中不能修改UI界面。
4 结论
在安卓开发中多线程是非常重要的操作,安卓中主要提供了两种方式来实现多线程:消息队列加Handler的方式和AsyncTask类的方式,两种方式各有优势,可以根据实际案例进行选择。