【Android】IntentService

Service 中的代码都是默认运行在主线程当中的,如果直接在Service 里处理一些耗时的逻辑,就很容易出现ANR(Application Not Responding )的情况。

所以,我们应该在Service 的每个具体的方法里开启一个子线程,然后在这里处理那些耗时的逻辑。
但是,这种Service 一旦启动,就会一直处于运行状态,必须调用stopService()或 stopSelf()方法,或者被系统回收,Service 才会停止。

因此,一个比较标准的Service 就可以写成如下形式:

class MyService : Service() { 
...override fun onStartCommand(intent: Intent, flags: Int, startId: Int): Int { thread {// 处理具体的逻辑stopSelf() }return super.onStartCommand(intent, flags, startId) }
}

Kotlin 提供了一种简单的开启线程的方式,写法如下:

thread {// 编写具体的逻辑 
}

这里的thread是一个Kotlin内置的顶层函数,我们只需要在Lambda 表达式中编写具体的逻辑就可以了,连start()方法都不用调用,thread函数在内部帮我们全部都处理好了。

虽说这种写法并不复杂,但是总会有一些程序员忘记开启线程,或者忘记调用stopSelf()方法。

为了可以简单地创建一个异步的、会自动停止的Service ,Android 专门提供了一个 IntentService 类,这个类就很好地解决了前面所提到的两种尴尬。

//首先,要求必须先调用父类的构造函数传入一个字符串。这个字符串可以随意指定,只在调试的时候有用。
class MyIntentService : IntentService("MyIntentService") {//然后,要在子类中实现onHandleIntent()这个抽象方法,这个方法中可以处理一些耗时的逻辑,而不用担心ANR的问题,因为这个方法已经是在子线程中运行的了!override fun onHandleIntent(intent: Intent?) { Log.d("MyIntentService", "Thread id is ${Thread.currentThread().name}") // 打印当前线程的id}override fun onDestroy() { super.onDestroy()Log.d("MyIntentService", "onDestroy executed") }
}

这里为了证实一下onHandleIntent确实是在子线程中运行的,我们在onHandleIntent()方法中打印了当前线程名。另外,根据 IntentService 的特性,这个Service 在运行结束后应该是会自动停止的,所以我们又重写了 onDestroy()方法,在这里也打印了一行日志,以证实Service 是不是停止了。

class MainActivity : AppCompatActivity() { ...override fun onCreate(savedInstanceState: Bundle?) { ...startIntentServiceBtn.setOnClickListener { // 打印主线程的idLog.d("MainActivity", "Thread id is ${Thread.currentThread().name}") val intent = Intent(this, MyIntentService::class.java) startService(intent)}}
}

其实IntentService 的启动方式和普通的Service 没什么两样。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/200019.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

基于NDK验签的方式实现APP重签名校验方案

APP重签名是指黑客通过修改APP的签名信息,使得APP看起来像是由原开发者签名发布的,但实际上是被黑客篡改过的。这种行为会破坏APP的完整性和安全性,给用户带来不必要的风险。因此,开发者需要采取一些措施来防止APP重签名,保护APP的安全性。其中一种常见的方式是基于NDK验签…

测绘资质测绘设备检定、校准管理制度

测绘设备检定、校准管理制度 建立健全测绘仪器设备检定、校准管理制度,明确测绘仪器设备的检定、校准、日常管理等要求

Unity环境配置并解决visual studio 不能智能代码提示Unity代码问题(一)

1、请先安装好unity和Visual Studio 2019 2、Visual Studio需要安装如图(2019才会有那个移动的可以勾选) 3、Unity配置 file->build setting windows->package manager 安装如下图 edit->preferences 3、创建c#脚本 如果还是没能智能提…

Centos7上安装Redis

第一步:安装Redis依赖 yum install -y gcc tcl //需要使用管理员权限第二步:下载上传安装包并解压 下载地址redis中文官网 上传成功后解压 输入tar -zxvf (redis版本),即可解压成功 进入redis目录,运行编译命令&am…

安全AI系统开发指南

执行摘要 本文件建议为使用人工智能(AI)的任何系统的提供商提供指导方针,无论这些系统是从头开始创建的,还是建立在他人提供的工具和服务之上的。实施这些指导方针将有助于提供商构建按预期运行、在需要时可用的人工智能系统&…

服务器以及页面无报错,但是ajax一直回调error。怎么查找报错信息,更好地了解到底是什么问题导致了请求失败

当 $.ajax 请求走到 error 回调时,说明在请求过程中发生了错误。为了更好地调试和定位问题,你可以在 error 回调中输出具体的错误信息。修改你的代码如下: $.ajax({url: "add",type: "POST",data: obj.field,success: f…

flutter记录报错日志

一、实现方式 自己实现不太现实,还是使用第三方平台,比如腾讯Bugly,免费的,地址:https://bugly.qq.com/ 二、引入 因为官网文档只有针对安卓和苹果的,没有flutter的,所以在网上找了一个库 引…

【 Go语言使用xorm框架操作数据库】

Go语言使用xorm框架操作数据库 Xorm 是一个简单而强大的Go语言ORM(对象关系映射)库。它支持自动将结构体映射到数据库表,并提供了一系列便捷的API来执行CRUD(创建、读取、更新和删除)操作。 安装 Xorm 首先&#xf…

LINUX 下部署github仓库

打开tumx django-admin startproject project_name #创建django项目 project_name配置git ssh-keygen # 生成密钥 连接 github 在github中打开setting 添加密钥 并且允许 write access git init # 把当前文件夹配置为git仓库 git config --global user.name xxx git config --g…

学习kafka

一个存放消息的组件生产者, 消费者, broker三部分消息队列的两种模式 *生产者和消费者(消费者主动拉取信息,然后删除) *发布订阅() kafka基础架构*一个topic有多个partition(副本&…

CTF特训日记day(4-6)

来复现一下2022QWB决赛的RDP题目 这两天腰疼去了趟医院 题目要求我们攻击XRDP程序,从而达到本地提权的效果。 首先观察XRDP程序的版本信息 rootRDP:/home/rdp/Desktop# xrdp-sesman -version xrdp-sesman 0.9.18The xrdp session managerCopyright (C) 2004-2020…

Diary12-Word表格

Word表格 一.制表符 1.制表 制表:tab键,一个tab键2个空格 2.制表符 使用了tab键之后,所留下来的标记,等同于段落标记 二.制表位与表格 1.制表位 制表位:是指制表符在水平标尺上的位置,指定文字缩进的…

【eNSP实践】eNSP实战篇(2)之简单实现交换机与主机的配置(图文详解)

目录 写在前面涉及知识1、交换机实验1.1 实验条件1.2 实验步骤A、打开eNSP软件,创建拓扑B、搭建主机与交换机连线C、配置交换机和主机D、验证不同网段设备可通性 1.3 通过交换机查看MAC地址 写在最后 写在前面 其实前面文章我有介绍关于路由器的使用,但…

Java多线程技术二:线程间通信——wait/notify机制

1 概述 线程时操作系统中独立的个体,但这些个体如果不经过特殊的处理是不能成为一个整体的。线程间的通信就是使线程成为整体的比用方案之一,可以说,是线程间进行通信后系统之间的交互性会更强大,CPU利用率会得以大幅提高&#xf…

linux 进程间几种常见通信方式介绍

在Linux系统中,进程间通信(Inter-Process Communication,IPC)是指进程之间进行信息交换和共享资源的一种机制。Linux系统提供了多种IPC方式,包括管道、消息队列、信号量、共享内存和套接字等。下面将详细介绍这些IPC方…

Spring Boot项目打包指定包名

在pom.xml文件中的添加<build></build>配置项<finalName>指定包名</finalName>&#xff0c;如想打包的包名叫myApp&#xff0c;添加<finalName>my_server</finalName>即可。 <?xml version"1.0" encoding"UTF-8"…

数据结构基础(不带头节点的单向非循环链表)

单链表完整代码 LinkList.hLinkList.ctest.c LinkList.h #pragma once#include <stdio.h> #include <stdlib.h> #include <assert.h> #include <string.h>typedef int ElemType; typedef struct LNode {ElemType data;struct LNode* next; }LNode;voi…

深入理解Linux =~

一、基本用法 在Linux中&#xff0c;~是用于正则表达式匹配的符号&#xff0c;其基本用法是&#xff1a; [[ $variable ~ pattern ]] 其中$variable是待匹配的字符串&#xff0c;pattern是正则表达式。如果匹配成功&#xff0c;则返回0&#xff0c;否则返回1。 例如&#x…

执法记录仪、一体化布控球等目前支持的AI智能算法、视频智能分析算法有哪些

一、前端设备实现AI算法 主要是基于安卓的布控球实现&#xff0c;已有的算法包括&#xff1a; 1&#xff09;人脸&#xff1b;2&#xff09;车牌&#xff1b;3&#xff09;是否佩戴安全帽&#xff1b;4&#xff09;是否穿着工装&#xff1b; 可以支持定制开发 烟雾&#xf…

使用晶振遇到的两个问题

并联电阻的问题 在一些方案中&#xff0c;晶振并联1MΩ电阻时&#xff0c;程序运行正常&#xff0c;而在没有1MΩ电阻的情况下&#xff0c;程序运行有滞后及无法运行现象发生。 原因分析&#xff1a; 在无源晶振应用方案中&#xff0c;两个外接电容能够微调晶振产生的时钟频率…