内容正文:
第12章 使用后台任务
Android Studio 移动应用开发基础(第 2 版)
978-7-121-44852-2
电子工业出版社
2023.01
目录
12.1 使用 Java 线程执行后台任务
12.2 同步练习一
12.3 使用 AsyncTask 工具类执行后台任务
12.4 使用 Service 完成后台任务
12.5 同步练习二
12.1 使用 Java 线程执行后台任务
在 Android 平台上,Activity 运行在称为 UI 线程的主线程中,并且 Android 操作系统对Activity 的响应时间有严格的要求:对每个用户操作的响应时长不能超过规定的时间长度,否则 Android 操作系统会出现异常,并且会影响用户的使用体验。
在 Android 平台上,执行时间较长的任务都应该放在后台进行。此外,执行时间较长的任务和执行时间不确定的任务,如网络通信,都必须放在后台执行。
在后台执行任务,完全可以使用 Java 的线程机制进行。
在 Android 应用程序中,在后台执行任务是非常普遍的,Android SDK 也提供了相应的机制,使在后台执行任务变得更加容易实现,包括使用 AsyncTask 工具类。
举例说明如何使用 Java 的 Thread 类执行后台任务。该应用程序可以使用一个 TextView 组件实时显示当前系统的日期和时间,运行效果如图 所示。点击“停止”按钮,可以停止实时显示当前系统的日期和时间,并且按钮上的文字会变为“启动”,再次点击该按钮,可以再次实时显示当前系统的日期和时间。
新建一个名为 Ch1201 的 Android 应用程序工程。修改布局文件 res/layout/activity_main.xml 中:
修改 res/values/strings.xml 文件:
修改 MainActivity.java 文件中的代码:
Android 中的每个 Activity 都运行在自己独立的线程中,这个线程通常称为 UI 线程,Activity 通过 UI 线程与用户进行交互。
为了保证界面交互的实时性、不影响用户体验,Android规定,Activity 完成交互的时间长度不能超过规定的时间长度(10 秒),如果超过规定的时间长度,那么 Android 会发生异常。
Android 规定,只能由 UI 线程对 Activity 中显示的信息进行更新,其他线程都不能更新 Activity 中显示的信息,否则会发生异常。
为了让非 UI 线程也能修改 Activity 中的信息,Android 为每个 Activity 都提供了一个默认的消息队列,需要修改Activity 中显示信息的线程通过这个消息队列向 Activity 发送消息,进而由 Activity 的 UI 线程修改 Activity 中显示的信息,Handler 类就是为此设计的。
12.2 同步练习一
读者可以将 12.1 节中的案例应用程序复制到自己的开发环境中,并且进行如下修改:每到整点,如早上 8:00、晚上 10:00,都会自动播放一段简短的音乐。
12.3 使用 AsyncTask 工具类执行后台任务
Android 为了便于执行后台任务,提供了 AsyncTask 工具类。
使用 AsyncTask 工具类,需要派生 AsyncTask 工具类的一个子类,并且重写 AsyncTask 工
具类中的以下 4 个方法:
(1)protected void onPreExecute()
(2)protected Result doInBackground(Params... params)
(3)protected void onProgressUpdate(Progress... values)
(4)protected void onPostExecute(Result result)
AsyncTask 工具类支持 3 个泛型的类参数,因此,在派生 AsyncTask 工具类的子类时,需要指出 3 个数据类型:第一个数据类型是传递给 doInBackground()方法的 Params 数据类型,第二个数据类型是传递给 onProgressUpdate()方法的 Progress 数据类型,第三个数据类型是传递给onPostExecute()方法的 Result 数据类型。对于不需要使用的参数,可以将其对应的 AsyncTask 泛型的类参数设置为 Void 类型。
举例说明如何使用 AsyncTask 工具类执行后台任务:使用 AsyncTask 工具类实现 12.1节中的案例应用程序,该案例应用程序运行效果的首界面如图 12-2 所示:
新建一个名为