赞
踩
下面来看一个实例,我们派生一个IntentService:
这里实现的是在onHandlerIntent中通过task_action来标识intent,Service通过这个标识来处理对应的intent。
总的来说,IntentService是一种拿来就用,用完就走的service,它串行执行完所有耗时任务后会通过stopSelf自动停止服务。
实例使用:传送门
Android中的线程池
线程池的三大优点:
(1)重用线程池中的线程,避免因为线程的创建和销毁带来的性能开销
(2)能有效控制线程的最大并发数,减少因为线程抢占资源导致的阻塞
(3)能够对线程进行简单的管理。
ThreadPoolExecutor
ThreadPoolExecutor是线程池的真正实现,它的构造方法提供了一系列的参数来配置线程池。
上面的构造方法中的参数分别代表:核心线程数、线程池能容纳的最多线程数、非核心线程闲置的超时时长、用于指定keepAliveTime的单位、线程池的队列、线程工厂。
ThreadPoolExecutor执行任务大致遵守如下规则:
(1)如果线程池的线程数未达到最大容纳量,那么会直接启动一个核心线程来执行任务。
(2)如果线程池中的线程数已达到或者超过最大容纳量,那么任务会被插入到任务队列中排队等待执行。
(3)如果步骤2中的任务队列已满,如果这个时候线程池中的线程数未达到最大容纳量,则立刻执行一个非核心线程来执行任务。
(4)如果步骤3中线程数量已经达到最大值,那么就拒绝执行此任务。会通过ThreadPoolExecutor的rejectedExecution来通知调用者。
在AsyncTask(两个线程中的THREAD_POOL_EXECUTOR)就明显的体现了线程池的特点:
核心线程为CPU核心+1、最大容纳量为CPU核心*2+1、非核心闲置时间为1s、任务队列容量为128。
线程池的分类
通过Executors的newFixedThreadPool创建。它是一种线程数量固定的线程池。当线程处于空闲时不会被回收,除非线程池被关闭。这意味着他们能更快速的相应外界的请求。
通过newChachedThreadPool创建。它是一种线程不固定的线程池,它只有非核心线程。并且最大线程数为Integer.MAX_VALUE,而这是一个特别大的数。当线程池中的线程都处于活动状态下,则会创建新的线程来执行新的任务,否则就会利用空闲线程来执行任务,空闲线程的闲置时间为60s。其任务队列为空,表明任何线程任务都会被立刻执行。所以它适用于大量并且耗时较少的任务。当所有线程都空闲时,线程池会被停止,几乎不占任何资源空间。
通过newScheduleThreadPool创建,它的核心线程数是固定的,而非核心线程数没有限制,并且当非核心线程闲置时,会被立刻回收。这个线程池主要用于执行定时任务和具有固定时间周期的重复任务。
通过newSingleThreadPoolExecutor创建。它只有一个核心线程,它确保所有的任务都在一个行程中按顺序执行。它的意义在于同于所有外界任务到一个线程中,这使得这些任务之间不用处理线程同步的问题。
线程池的用法:
Bitmap和加载Chache
因为Android对单个应用所施加的内存限制如16mb,所以我们想办法高速加载Bitmap。
实际开发中经常用到Bitmap做缓存。比较常用的缓存策略有LruChache和DiskLruChache。
前者常被用做内存缓存,后者则是存储缓存。Lru是Least Recently Used的缩写,即最近最少使用算法,它的核心思想为:当缓存快满时,会淘汰近期最少使用的缓存目标。
Bitmap的高效加载
如何加载一个Bitmap呢,BitmapFactory提供了四个方法:decodeFile、decodeResource、decodeStream、decodeByteArray,分别用于从文件系统、资源、输入流以及字节数组中加载处一个Bitmap对象。都是Android底层实现的,对应着BitmapFactory的几个native方法。
**高效加载Bitmap核心思想就是使用Bitmap.Options方法加载所需尺寸的图片。**因为一般ImageView的尺寸都没有图片大,所以把图片整个加载进来就显得很拖沓,所以先把图片按照一定的采样率缩小,然后加载给ImageView。这会一定程度避免程序OOM,提高了加载性能。
通过Options来缩放图片,主要用到的是inSampleSize参数,即采样率。当其大于1,比如为2时,图片宽高取1/2,像素变为原来的1/4,内存也变为1/4,比如一个1024*1024像素采用ARGB8888存储格式的图片来说,其大小为1024*1024*4=4mb,缩小后大小为1mb。所以采样率的缩放比例为1/(inSampleSize^2),比如采样率为4,则缩放比例就是1/16。一般这个数自定位2的指数。
获取采样率的步骤:
(1)将BitmapFactory.Options的inJustDecodeBounds参数设置为true并加载图片
自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。
深知大多数初中级安卓工程师,想要提升技能,往往是自己摸索成长,但自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!
因此收集整理了一份《2024年最新Android移动开发全套学习资料》送给大家,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频
如果你觉得这些内容对你有帮助,可以添加下面V无偿领取!(备注Android)
【Android 详细知识点思维脑图(技能树)】
其实Android开发的知识点就那么多,面试问来问去还是那么点东西。所以面试没有其他的诀窍,只看你对这些知识点准备的充分程度。so,出去面试时先看看自己复习到了哪个阶段就好。
虽然 Android 没有前几年火热了,已经过去了会四大组件就能找到高薪职位的时代了。这只能说明 Android 中级以下的岗位饱和了,现在高级工程师还是比较缺少的,很多高级职位给的薪资真的特别高(钱多也不一定能找到合适的),所以努力让自己成为高级工程师才是最重要的。
这里附上上述的面试题相关的几十套字节跳动,京东,小米,腾讯、头条、阿里、美团等公司19年的面试题。把技术点整理成了视频和PDF(实际上比预期多花了不少精力),包含知识脉络 + 诸多细节。
由于篇幅有限,这里以图片的形式给大家展示一小部分。
详细整理在GitHub点击可见;
网上学习 Android的资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。希望这份系统化的技术体系对大家有一个方向参考。
记](https://bbs.csdn.net/topics/618156601)**
网上学习 Android的资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。希望这份系统化的技术体系对大家有一个方向参考。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。