Service个人笔记4 --IntentService处理耗时任务

2024-05-25 19:48

本文主要是介绍Service个人笔记4 --IntentService处理耗时任务,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

本文章中的代码来自 《疯狂Android讲义》

Service可以后台处理一些简单的任务,但是不建议使用Service处理耗时任务。

原因:
1.Service 不会专门启动一条单独的进程,Service与它所在的应用位于同一个进程中。
(Service开启不会启动新线程)
2.Service 本身也不是一条新的线程(Service本身不是新线程)

对于第一个问题,有两种解决方案

    1.在Service中自己另外启动一个线程来处理耗时任务。(可以实现,但存在线程安全问题)2.在 其他的组件中处理耗时任务,不在Service中完成。(有漏洞)

第1中方法,是可以实现但是当多个异步线程执行时,不能保证线程安全。

第2种方法,是存在缺陷的

    比如你将 耗时任务放在Activity或者BroadcastReceiver中 开启一个子线程 处理。首先Activity随时会被用户退出,BroadcastReceiver的生命周期也很短。 可能出现的问题是: 在耗时任务还没有处理完的时候,Activity,或者BroadcastReceiver已经被销毁了。 此时耗时任务所在的子线程的宿主进程就变成了空进程(没有任何活动组件的进程),系统需要内存的时候会优先终止该进程。这样就可能导致 任务无法正常完成。每次系统的Broadcast事件发生之后,系统会创建对应的BroadcastReceiver的实例,并自动触   发onReceive()方法,onReceiver执行完之后BroadcastReceiver的实例就会被销毁。所以生命周期很短而且如果BroadcastReceiver的onReceiver()方法不能在10秒钟内执行完,Android会认为程序无响应(ANR),所以耗时任务是不建议放在onReceive()方法中的

所以Android给我们提供了一个新的Service—->IntentService

IntentService将会使用队列来管理请求Intent,每当客户端代码通过Intent请求启动IntentService时,
IntentService会将该Intent加入队列中,然后开启一条新的worker线程来处理Intent。对于异步的startService()请求,IntentService会按次序的一次处理队列中的Intent,该线程保证同一时刻
只处理一个Intent。(这样对于多个线程的安全问题就可以不用我们操心了)而且IntentService使用新的worker线程处理Intent请求,因此不会阻塞UI线程。

IntentService特征:

*IntentService会创建单独的worker线程来处理所有的Intent请求。
*IntentService会创建单独的worker线程来处理onHandleIntent()方法实现的代码,因此开发者无需处理多线程问题
*当所有请求完成之后,IntentService会自动停止,因此开发者无需调用stopSelf()方法来停止该Service
*为Service的onBind()方法提供了默认实现,默认实现的onBind()方法返回null。这样就不用自己重写onBind()方法了
*为Service的onStartCommand()方法提供了默认实现,该实现会将请求Intent添加到队列中。

因此我们创建一个IntentService的子类的时候只需要重写onHandleIntent()方法就可以 了

定义:IntentService是一个用来在Service中处理耗时任务的封装好了类。
不用考虑,多线程问题,ANR问题。

下面贴出代码,看具体实现过程

Activity实现

public class IntentServiceTest extends Activity
{@Overridepublic void onCreate(Bundle savedInstanceState){super.onCreate(savedInstanceState);setContentView(R.layout.main);}public void startService(View source){// 创建需要启动的Service的IntentIntent intent = new Intent(this, MyService.class);// 启动ServicestartService(intent);}public void startIntentService(View source){// 创建需要启动的IntentService的IntentIntent intent = new Intent(this, MyIntentService.class);// 启动IntentServicestartService(intent);}
}

IntentService实现

public class MyIntentService extends IntentService
{public MyIntentService(){super("MyIntentService");}// IntentService会使用单独的线程来执行该方法的代码@Overrideprotected void onHandleIntent(Intent intent){// 该方法内可以执行任何耗时任务,比如下载文件等,此处只是让线程暂停20秒long endTime = System.currentTimeMillis() + 20 * 1000;System.out.println("onStart");while (System.currentTimeMillis() < endTime){synchronized (this){try{wait(endTime - System.currentTimeMillis());}catch (Exception e){}}}System.out.println("---耗时任务执行完成---");}
}

普通Service实现

public class MyService extends Service
{@Overridepublic IBinder onBind(Intent intent){return null;}@Overridepublic int onStartCommand(Intent intent, int flags, int startId){// 该方法内执行耗时任务可能导致ANR(Application Not Responding)异常long endTime = System.currentTimeMillis() + 20 * 1000;System.out.println("onStart");while (System.currentTimeMillis() < endTime){synchronized (this){try{wait(endTime - System.currentTimeMillis());}catch (Exception e){}}}System.out.println("---耗时任务执行完成---");return START_STICKY;}
}

这篇关于Service个人笔记4 --IntentService处理耗时任务的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1002461

相关文章

Tolua使用笔记(上)

目录   1.准备工作 2.运行例子 01.HelloWorld:在C#中,创建和销毁Lua虚拟机 和 简单调用。 02.ScriptsFromFile:在C#中,对一个lua文件的执行调用 03.CallLuaFunction:在C#中,对lua函数的操作 04.AccessingLuaVariables:在C#中,对lua变量的操作 05.LuaCoroutine:在Lua中,

AssetBundle学习笔记

AssetBundle是unity自定义的资源格式,通过调用引擎的资源打包接口对资源进行打包成.assetbundle格式的资源包。本文介绍了AssetBundle的生成,使用,加载,卸载以及Unity资源更新的一个基本步骤。 目录 1.定义: 2.AssetBundle的生成: 1)设置AssetBundle包的属性——通过编辑器界面 补充:分组策略 2)调用引擎接口API

《offer来了》第二章学习笔记

1.集合 Java四种集合:List、Queue、Set和Map 1.1.List:可重复 有序的Collection ArrayList: 基于数组实现,增删慢,查询快,线程不安全 Vector: 基于数组实现,增删慢,查询快,线程安全 LinkedList: 基于双向链实现,增删快,查询慢,线程不安全 1.2.Queue:队列 ArrayBlockingQueue:

操作系统实训复习笔记(1)

目录 Linux vi/vim编辑器(简单) (1)vi/vim基本用法。 (2)vi/vim基础操作。 进程基础操作(简单) (1)fork()函数。 写文件系统函数(中等) ​编辑 (1)C语言读取文件。 (2)C语言写入文件。 1、write()函数。  读文件系统函数(简单) (1)read()函数。 作者本人的操作系统实训复习笔记 Linux

智能客服到个人助理,国内AI大模型如何改变我们的生活?

引言 随着人工智能(AI)技术的高速发展,AI大模型越来越多地出现在我们的日常生活和工作中。国内的AI大模型在过去几年里取得了显著的进展,不少独创的技术点和实际应用令人瞩目。 那么,国内的AI大模型有哪些独创的技术点?它们在实际应用中又有哪些出色表现呢?此外,普通人又该如何利用这些大模型提升工作和生活的质量和效率呢?本文将为你一一解析。 一、国内AI大模型的独创技术点 多模态学习 多

LVGL快速入门笔记

目录 一、基础知识 1. 基础对象(lv_obj) 2. 基础对象的大小(size) 3. 基础对象的位置(position) 3.1 直接设置方式 3.2 参照父对象对齐 3.3 获取位置 4. 基础对象的盒子模型(border-box) 5. 基础对象的样式(styles) 5.1 样式的状态和部分 5.1.1 对象可以处于以下状态States的组合: 5.1.2 对象

百度OCR识别结构结构化处理视频

https://edu.csdn.net/course/detail/10506

DDS信号的发生器(验证篇)——FPGA学习笔记8

前言:第一部分详细讲解DDS核心框图,还请读者深入阅读第一部分,以便理解DDS核心思想 三刷小梅哥视频总结! 小梅哥https://www.corecourse.com/lander 一、DDS简介         DDS(Direct Digital Synthesizer)即数字合成器,是一种新型的频率合成技术,具有低成本、低功耗、高分辨率、频率转换时间短、相位连续性好等优点,对数字信

如何在Java中处理JSON数据?

如何在Java中处理JSON数据? 大家好,我是免费搭建查券返利机器人省钱赚佣金就用微赚淘客系统3.0的小编,也是冬天不穿秋裤,天冷也要风度的程序猿!今天我们将探讨在Java中如何处理JSON数据。JSON(JavaScript Object Notation)作为一种轻量级的数据交换格式,在现代应用程序中被广泛使用。Java通过多种库和API提供了处理JSON的能力,我们将深入了解其用法和最佳

如何设置windows计划任务

如何设置windows计划任务 前言:在工作过程中写了一个python脚本,用于调用jira接口查询bug单数量,想要在本地定时任务执行,每天发送到钉钉群提醒,写下操作步骤用于记录。 1. 准备 Python 脚本 确保你的 Python 脚本已经保存到一个文件,比如 jira_reminder.py。 2. 创建批处理文件 为了方便任务计划程序运行 Python 脚本,创建一个批处理文