一.Service能不能执行耗时操作?
Service是Android四大组件之一,是运行在后台的服务,可用来执行不需要在前台展示的动作,如播放音乐等;有些人可能会认为,

Service竟然是在后台运行的那不就可以用来执行耗时操作了,这样也不会影响前台页面,其实不行,因为Service也是运行在主线程,Service的onStartCommand() 和 onBind() 方法中不能执行耗时操作

所以Service是不能用来执行耗时操作的。

二.Service中开启线程
   既然Service不能执行耗时操作,那么如果我们需要在Service中执行耗时操作要怎么办呢? 那肯定是开启子线程来处理:

例如:

            new Thread(new Runnable() {@Overridepublic void run() {}}).start();

这样确实可以,但是Android中提供了一个封装好子线程的Service给我们使用,使用起来更加简单,那就是IntentService。

三.IntentService的使用:
1.IntentService简介:

IntentService是继承Service的抽象类,在IntentService中有一个工作线程来处理耗时操作。

2.IntentService源码

我们先来看下IntentService的源码:

public abstract class IntentService extends Service {
    private volatile Looper mServiceLooper;
    private volatile ServiceHandler mServiceHandler;
    private String mName;
    private boolean mRedelivery;

IntentService继承Service

@Override
public void onCreate() {
    // TODO: It would be nice to have an option to hold a partial wakelock
    // during processing, and to have a static startService(Context, Intent)
    // method that would launch the service & hand off a wakelock.

super.onCreate();
    HandlerThread thread = new HandlerThread("IntentService[" + mName + "]");
    thread.start();

mServiceLooper = thread.getLooper();
    mServiceHandler = new ServiceHandler(mServiceLooper);

}

我们看到IntentService的onCreate方法中利用HandlerThread创建了一个循环的工作线程,然后将工作线程中的Looper对象作为参数来创建ServiceHandler消息执行者。

3.IntentService的使用:

    public class TestService extends IntentService {public TestService() {super("TestService");}@Overrideprotected void onHandleIntent(@Nullable Intent intent) {//执行耗时操作}}

可以看到IntentService的使用非常简单。

Android 避免耗时操作及解决办法

1、Service的onStartCommand() 和 onBind() 方法中不能执行耗时操作
2、BroadcastReceiver的onReceive方法不能执行耗时操作,因为这个方法是在主线程执行的,耗时操作会导致UI不顺畅,超过10秒钟可能会被系统杀死
3、UI线程执行耗时操作,可以采用View.post方法来执行,或者使用Handler
4、onPause 中不适合做耗时较长的操作,Activity的跳转要先执行完前一个Activity的onPause方法,如果执行耗时操作会影响UI的显示

书到用时方恨少,纸上得来终觉浅。现在大环境不好,内卷很严重,加油。

Android怎么在Service中执行耗时操作相关推荐

  1. 使用IntentService在Service中创建耗时任务

    IntentService是Service的子类,比普通的Service增加了额外的功能. Service存在两个问题: 1,Service不会专门启动一条单独的线程,Service与它所在应用访问者 ...

  2. android编程任务进度条,Android应用开发之AsyncTask 处理耗时操作和显示进度条

    在Android中实现异步任务机制有两种,Handler和AsyncTask.优缺点自己百度,推荐使用AsyncTask. private ProgressDialog dialog; //新建一个对 ...

  3. ORA-14551: 无法在查询中执行 DML 操作

    最近在调试一个带DML操作的函数时,一直不成功,在PL/SQL中测试时没问题,通过SQL语句调用函数时就不行了,刚开始一直没找到原因,后来无意间把 函数中捕获异常的代码注释掉,终于通过SQL调试时,弹 ...

  4. 使用SQL数据库在Python中执行CRUD操作

    目录 介绍 背景 在Visual Studio中创建一个Python项目 在SQL中创建数据库和表 为数据库创建配置文件 安装Python包 "Pypyodbc" 创建连接文件 创 ...

  5. PL/SQL“ ORA-14551: 无法在查询中执行 DML 操作”解决

    环境 Oracle 11.2.0 + SQL Plus 问题 根据以下要求编写函数:将scott.emp表中工资低于平均工资的职工工资加上200,并返回修改了工资的总人数.PL/SQL中有更新的操作, ...

  6. 【数据库】请问在 score表中执行以下操作:count( studentNo)、 count( score)、 count( * )、avg( studentNo)、 avg( score)、avg

    题目 请问在 score表中执行以下操作:count( studentNo). count( score). count( * ).avg( studentNo). avg( score).avg( ...

  7. android 按钮中断,android – 如何“中断”在AccessibilityService中执行的操作?

    我想做什么/我做了什么:我正在尝试为视障用户制作一个非常基本的TalkBack版本.我做了一个简单的辅助功能服务,读取用户点击的按钮的contentDescription并大声读出. @Overrid ...

  8. StarWars.Android 界面粉碎效果中的openGL操作解析

    最近在学习openGL,就找了几个相关的开源项目,一边理解,一边记录~ 这篇文章要介绍的项目来自久负盛名的yalantis 阅读此文需要一点OpenGL基础,比如纹理坐标. 项目giuhub地址 首先 ...

  9. java gridfs_如何在GridFS中执行更新操作(使用Java)?

    我使用的Mongo-Java-Driver 2.13是在 GridFS中 存储了一个PDF文件( 大小 为 30mb) .我能够轻松地执行插入,删除和查找操作. MongoClient mongo = ...

  10. 6-6 调查 :在6.3.1节编写的程序favorite_languages.py中执行以下操作

    创建一个应该会接受调查的人员名单,其中有些人已包含在字典中,而其他人未包含在字典中. 遍历这个人员名单,对于已参与调查的人,打印一条消息表示感谢.对于还未参与调查的人,打印一条消息邀请他参与调查. ​ ...

最新文章

  1. vb.net 设置打印纸张与页边距_文字办公—Word文档如何设置装订线
  2. 实验4-2-3 pta验证“哥德巴赫猜想” (20分)
  3. 无法开启计算机,Win7下鼠标右键无法开启计算机属性怎么办?
  4. 如何检测C语言中的内存漏洞(leak)?
  5. 前后端分离——token超时刷新策略
  6. 泉州中考分数如何计算机,2019年泉州中考总分多少分,泉州中考考试科目设置
  7. 【性能优化】PHP代码输出压缩后HTML
  8. DongLiORM 介绍
  9. 今天迈出第一步,开始了解iphone开发
  10. android adb安装 apk,adb 安装并运行 apk
  11. 【矩阵论】矩阵的广义逆
  12. CTFshow 愚人节欢乐赛 部分WP
  13. ThingJS:如何一键生成3D城市地图
  14. java大作穿越arpg_动作与角色扮演完美结合 精品ARPG游戏盘点
  15. 基于HTML5的在线绘图工具,基于HTML5 Canvas和jQuery 的绘图工具的实现
  16. c语言 字符金字塔问题
  17. e7用什么主板_八路E7的下场如何?盘点历代至尊版处理器现价
  18. ICLR2020 || 106篇深度强化学习顶会论文汇总
  19. texturepacker 打包图集
  20. PTA 海盗分赃 (25分)

热门文章

  1. Python中单线程、多线程和多进程的效率对比实验
  2. Spring漫画学习笔记(二) 什么是BeanFactory
  3. 数据管理DMS移动版之2018新年巨献
  4. mysql 关闭防火墙 命令_CentOS7关闭防火墙命令
  5. 基于Kotlin、ViewModel、LiveData和LifeCycle开发的Readhub客户端
  6. 不义联盟网站无法连接服务器,不义联盟2总是显示无法连接网络
  7. 计算机模糊,电脑显示不清晰_如果计算机显示器模糊或不清楚,该怎么办
  8. 10行代码玩转弹性调度的小把戏
  9. 长尾词推广系统推荐乐云seo_长尾词优化推广很好乐云seo
  10. 线性代数之——正定矩阵