APP下载

浅析安卓开发中的多线程

2016-10-21张旭辉

电子技术与软件工程 2016年9期
关键词:多线程消息

张旭辉

【关键词】多线程 消息 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类的方式,两种方式各有优势,可以根据实际案例进行选择。

猜你喜欢

多线程消息
Java并发工具包对并发编程的优化
消息
消息
消息
消息
消息