首页
学习
活动
专区
圈层
工具
发布

Android性能优化面试题经典之ANR的分析和优化

常见的耗时操作 在Android开发中,导致应用程序无响应(ANR)的一些常见耗时操作包括: 网络操作: 例如,HTTP 请求、下载文件、访问REST API等。...广播接收器应该尽快完成其工作或将耗时任务移到异步线程。 Service 启动: 如果在主线程中启动较为耗时的Service,也可能导致ANR。所以服务启动过程中的耗时操作应该在子线程中执行。...Java使用子线程的方式有哪些 启Thread方式,或是线程池 使用AsyncTask HandlerThread IntentService,Service是运行在主线程的, 然而IntentService...(官方建议使用JetPack组件中的WorkManager或者JobIntentService类代替它) 使用Thread和HandlerThread时, 为了使效果更好, 建议设置Thread的优先级偏低一点

46410
  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    Android 多线程实现方式

    最近打算关掉博客,专注公众号,发现瘫痪的博客上面有一些 3 年前写的技术文章,看了一下还是不舍得扔掉,暂且迁移到这里。微信上贴代码的技术文章一般不受人待见,注意前方高能预警。 0....Android 提供了四种常用的多线程实现方式: AsyncTask 异步消息机制 IntentService ThreadPoolExcutor 1....AsyncTask Android AsyncTask 类,它是封装好的线程池,操作 UI 线程极其方便。...Looper 负责创建 MessageQueue 消息对列,然后进入一个无限 for 循环中,不断地从消息队列中取消息,如果消息队列为空,当前线程阻塞,Handler 负责向消息队列中发送消息。...quitAllowed); mRun = true; mThread = Thread.currentThread(); } loop ,进入一个无限 for 循环体中,不断地从消息队列中取消息

    1.1K40

    Android 多线程-IntentService详解

    : IntentService实现类如下: package com.zejian.handlerlooper; import android.app.IntentService; import android.content.Intent...,这里有两个方法是必须实现的,一个是构造方法,必须传递一个线程名称的字符串,另外一个就是进行异步处理的方法onHandleIntent(Intent intent) 方法,其参数intent可以附带从activity...好~,我们运行一下代码: 每间隔一秒去更新图片,接着我们看一组log:   从Log可以看出onCreate只启动了一次,而onStartCommand和onStart多次启动,这就证实了之前所说的...START_REDELIVER_INTENT : START_NOT_STICKY; } 从源码我们可以看出,在onStart方法中,IntentService通过mServiceHandler的sendMessage...,而Looper是按顺序从消息队列中取任务的,也就是说IntentService的后台任务时顺序执行的,当有多个后台任务同时存在时,这些后台任务会按外部调用的顺序排队执行,我们前面的使用案例也很好说明了这点

    84330

    关于 Android 进程和线程,你必须了解的东西

    线程 ---- 线程在 Android 中是一个很重要的概念,从用途上来说,线程分为主线程和子线程,主线程的作用是「运行四大组件以及处理它们和用户的交互」,而子线程的作用则是「执行耗时任务,比如网络请求...、I/O 操作等」,由于 Android 的特性,如果在主线程中执行耗时操作那么就会导致程序无法及时地响应。...Android 中的线程形态 除了 Thread 本身以外,在 Android 中可以扮演线程角色的还有很多,比如 AsyncTask 和 IntentService,同时 HandlerThread...从任务执行的角度来看,IntentService 的作用很像一个后台线程,但是 IntentService 是一种服务,它不容易被系统杀死从而可以尽量保证任务的执行,而如果是一个后台线程的话,由于这个时候进程中没有活动的四大组件...主线程的一些事 从 Android 3.0 开始,系统要求网络访问必须在子线程中进行,否则网络访问将会失败并抛出 NetworkOnMainThreadException 这个异常,这样做是为了避免主线程由于被耗时操作阻塞从而出现

    1.1K20

    Android App优化之提升你的App启动速度之实例挑战

    既然已经知道了哪些地方耗时长, 我们不妨调整下Application的onCreate实现, 一般来说我们可以将这些初始化放在一个单独的线程中处理, 为了方便今后管理, 这里我用了一个InitializeService的IntentService...明确一点, IntentService不同于Service, 它是工作在后台线程的....InitializeService.java代码如下: package com.anly.githubapp.compz.service;import android.app.IntentService...前文理论基础有说到, 这个空白的窗口展示跟主题相关, 那么我们是不是可以从首屏的主题入手呢?...这种优化, 对于有些Application内的初始化工作不能移到子线程做的情况, 是非常友好的. 可以避免我们的App长时间的呈现给用户一个空白的窗口. 结语 照例, 总结下.

    73230

    Android Service的解析

    Service作为Android四大组件之一,其功能之一就是耗时操作的执行,主要功能如下: 执行需要长时间运行的操作,这个操作不与用户进行交互,如网络下载、大文件I/O、复杂计算。...即下节要介绍的IntentService。...IntentService IntentService的概念 IntentService是Android中的一个系统封装类,继承自四大组件之一的Service,主要用于处理异步请求,实现多线程,它有以下特点...IntentService的创建 编写自己的Service类继承IntentService,并重写其中的onHandleIntent(Intent)方法,该方法是IntentService的一个抽象方法..." /> IntentService的启动 然后创建一个TgsActivity的测试活动,并在点击按钮时调用startService系统函数来开启IntentService的服务,示例代码如下: public

    49810

    Android入门教程 | 四大组件之Service(前台服务,后台服务)

    例如,服务可在后台处理网络事务、播放音乐,执行文件 I/O 或与内容提供程序进行交互。 前台服务 台服务执行一些用户能注意到的操作。例如,音频应用会使用前台服务来播放音频曲目。前台服务必须显示通知。...notificationIntent, 0) } if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O)...startForeground(1, notification) } else { Log.d(TAG, "${Build.VERSION.SDK_INT} O(...添加 IntentService 组件声明,在 AndroidManifest.xml 文件中声明一个 Service 组件,其代码如下: android:name=".service.SccIntentService...IntentService还有个好处就是 「用完即走」。执行完onHandleIntent()方法里面的耗时操作后,自行调用onDestroy()方法,进行关闭。 Android入门教程视频参考

    7.2K30

    Art of Android Development Reading Notes 11

    (2)在Android中除了Thread,还有HandlerThread、AsyncTask以及IntentService等也都扮演着线程的角色,只是它们具有不同的特性和使用场景。...(3)从Android 3.0开始,系统要求网络访问必须在子线程中进行,否则网络访问将会失败并抛出NetworkOnMainThreadException这个异常,这样做是为了避免主线程由于被耗时操作所阻塞从而出现...4.在Android 1.6之前,AsyncTask是串行执行任务的,Android 1.6的时候AsyncTask开始采用线程池并行处理任务,但是从Android 3.0开始,为了避免AsyncTask...AsyncTask中还有一个Handler,即InternalHandler,用于将执行环境从线程池切换到主线程。...HandlerThread的最主要的应用场景就是用在IntentService中。 (4)IntentService是一个继承自Service的抽象类,要使用它就要创建它的子类。

    58420

    IntentService使用及源码分析

    我们知道Service和Activity一样是Android的四大组件之一,Service简称为后台服务,具有较高的优先级别。我们平时在Activity中直接开启Service,是运行在主线程的。...:name=".MyIntentService" android:exported="false"> 3)启动我们的Service,这里使用context.startService...* * @param intent The value passed to {@link * android.content.Context#...这里我们以startService()为例分析,从我们启动一个IntentService,调用的过程大概是这样的, 构造方法 ->onCreate()- >onStartCommand()- >onStart...但会调用我们的onStart()方法,而在我们的onStart()方法里面我们调用mServiceHandler.sendMessage(msg);相当于是向消息队列里面插入一条信息,Looper会不断地从里面取出消息

    54900

    App冷启动,你还要我怎样?

    问题所在 后台无app残留的进程服务,重新打开app的时候,从初始化application,结束后再到欢迎界面,很多情况下,就是因为初始化application的时间过长导致了app假死的状态,然后再导致...方法一:IntentService 简单说,IntentService是继承于Service并处理异步请求的一个类,在IntentService内有一个工作线程来处理耗时操作,启动IntentService...另外,可以启动IntentService多次,而每一个耗时操作会以工作队列的方式在IntentService的onHandleIntent回调方法中执行,并且,每次只会执行一个工作线程,执行完第一个再执行第二个...看到IntentService的介绍,我们就想,可以不可以把耗时的初始化都丢到这里来呢?...当程序员容易,当一个优秀的程序员是需要不断学习的,从初级程序员到高级程序员,从初级架构师到资深架构师,或者走向管理,从技术经理到技术总监,每个阶段都需要掌握不同的能力。

    2K00

    【Android】Service介绍和生命周期

    那么我们当我们编写的耗时逻辑,不得不被service来管理的时候,就需要引入IntentService,IntentService是继承Service的,那么它包含了Service的全部特性,当然也包含...要覆盖IntentService的其它函数时,注意要通过super调用父类的对应的函数 示例: package com.loaderman.intentservicedemo; import android.content.Intent...,会发现应用程序不会阻塞,而且最重要的是第二次的请求会再第一个请求结束之后运行(这个证实了IntentService采用单独的线程每次只从队列中拿出一个请求进行处理) startService...onBind(Intent intent) { return null; } } package com.loaderman.intentservicedemo; import android.app.IntentService...; import android.content.Intent; public class MyIntentService extends IntentService { public

    1.1K10

    Android性能优化典范之多线程篇

    所幸的是,Android 系统为我们提供了 Looper,Handler,MessageQueue 来帮助实现上面的线程任务模型: Looper: 能够确保线程持续存活并且可以不断的从任务队列中获取任务并进行执行...例如使用 Networking Thread 用来专门处理网络请求的操作,使用 IO Thread 用来专门处理系统的 I\O 操作。...在 Android 系统里面,我们可以通过 android.os.Process.setThreadPriority(int) 设置线程的优先级,参数范围从-20到19,数值越小优先级越高。...Android 系统里面的 AsyncTask 与 IntentService已经默认帮助我们设置线程的优先级,但是对于那些非官方提供的多线程工具类,我们需要特别留意根据需要自己手动来设置线程的优先级。...Profile GPU Rendering : M Update 从 Android M 系统开始,系统更新了 GPU Profiling 的工具来帮助我们定位 UI 的渲染性能问题。

    1.7K11

    App冷启动,你还要我怎样?

    android:name="android.intent.action.MAIN" /> android:name="...问题所在 后台无app残留的进程服务,重新打开app的时候,从初始化application,结束后再到欢迎界面,很多情况下,就是因为初始化application的时间过长导致了app假死的状态,然后再导致...方法一:IntentService 简单说,IntentService是继承于Service并处理异步请求的一个类,在IntentService内有一个工作线程来处理耗时操作,启动IntentService...另外,可以启动IntentService多次,而每一个耗时操作会以工作队列的方式在IntentService的onHandleIntent回调方法中执行,并且,每次只会执行一个工作线程,执行完第一个再执行第二个...看到IntentService的介绍,我们就想,可以不可以把耗时的初始化都丢到这里来呢?

    1.4K20

    冷启动与热启动,AsyncTask,HandlerThread,IntentService,Service 保活,IntentService

    热启动因为会从已有的进程中来启动,所以热启动就不会走Application这步了,而是直接走MainActivity(包括一系列的测量、布局、绘制),所以热启动的过程只需要创建和初始化一个MainActivity...就行了,而不必创建和初始化Application 冷启动的流程 当点击app的启动图标时,安卓系统会从Zygote进程中fork创建出一个新的进程分配给该应用,之后会依次创建和初始化Application...在Android3.0开始,execute方法串行执行任务的,一个一个来,3.0之前是并行执行的。...可以通过Intent的方式开启IntentService,IntentService通过handler将每一个intent加入HandlerThread子线程中的消息队列,通过looper按顺序一个个的取出并执行...,执行完成后自动结束自己,不需要开发者手动关闭 IntentService是Service的子类,比普通的Service增加了额外的功能。

    57410

    2016级移动应用开发在线测试12-service

    以下对intentservice描述错误的是   您的回答为:intentservice本质是一种特殊的Service,继承自Service是一个最终类。   ...()intentservice可以用于在后台执行耗时的异步任务,当任务完成后会自动停止 ()intentservice拥有较高的优先级,不易被系统杀死(继承自Service的缘故),因此比较适合执行一些高优先级的异步任务...()即使我们多次启动IntentService,但IntentService的实例只有一个,这跟传统的Service是一样的,最终IntentService会去调用onHandleIntent执行异步任务...()intentservice内部通过HandlerThread和Handler实现异步操作 ()继承IntentService,有两个方法必须实现,一个是构造方法,必须传递一个线程名称的字符串,另外一个就是进行异步处理的方法...onHandleIntent(Intent intent)方法,其参数intent可以附带从activity传递过来的数据。

    82420

    线程优化

    处于运行状态 多线程并发,轮流获取CPU使用权 JVM 负责线程的调度:按照特定的机制分配CPU使用权 调度模型 分时调度模型:轮流获取,均分CPU时间 抢占式调度模型:优先级高的进行获取,JVM采用 Android...Thread 最简单,常用的线程使用方式 - 不能够重复使用,频繁创建会造成很大的开销 - 在复杂的场景也不容易使用 HandlerThread 自带消息循环的线程 - 串行执行 - 长时间运行,不断从队列中获取任务...HandlerThread 是 Android 封装的一个线程类,将 Thread 跟 Handler 封装。...可以启动 IntentService 多次,而每一个耗时操作会以队列的方式在 IntentService 的 onHandlerIntent 回调方法中执行,并且,每一次只会执行一个工作线程,执行完第一个再执行第二个...IntentService源码: 通过 HandlerThread 单独开启一个名为 IntentService 的线程 创建一个名叫 ServiceHandler 的内部 Handler

    1.2K10

    Carson带你Android面试:Android语言篇

    ContentProvider:具体使用、Intent、Binder Service:简介、生命周期、IntentService、保活(含进程保活) 关于四大组件的相关内容文章,都可以从我的文集找到:Carson...多线程 此处涵盖了Android所有多线程、异步通信的内容,主要包括: Handler:使用、机制、原理 AsyncTask:原理 & 使用 HandlerThread:原理、特点 & 使用 IntentService...:原理、特点 & 使用 多线程使用场景 & 特点(继承Thread类 / 实现Runnable、AsycTask、IntentService、HandlerThread) 关于多线程的相关内容文章,都可以从我的文集找到...常见使用的相关内容文章,都可以从我的文集找到:Carson带你学:Android使用技巧 4....性能优化:内存优化 Android性能优化:Bitmap图片资源优化 Android性能优化:绘制优化 关于Android自定义View的相关内容文章,都可以从我的文集找到:Carson带你学:自定义View

    75420
    领券