当前位置:   article > 正文

Android 开发艺术探索笔记(22),这篇文章可以满足你80%日常工作

android 开发艺术

下面来看一个实例,我们派生一个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。

线程池的分类

  • FixedThreadPool

通过Executors的newFixedThreadPool创建。它是一种线程数量固定的线程池。当线程处于空闲时不会被回收,除非线程池被关闭。这意味着他们能更快速的相应外界的请求。

  • ChachedThreadPool

通过newChachedThreadPool创建。它是一种线程不固定的线程池,它只有非核心线程。并且最大线程数为Integer.MAX_VALUE,而这是一个特别大的数。当线程池中的线程都处于活动状态下,则会创建新的线程来执行新的任务,否则就会利用空闲线程来执行任务,空闲线程的闲置时间为60s。其任务队列为空,表明任何线程任务都会被立刻执行。所以它适用于大量并且耗时较少的任务。当所有线程都空闲时,线程池会被停止,几乎不占任何资源空间。

  • ScheduleThreadPool

通过newScheduleThreadPool创建,它的核心线程数是固定的,而非核心线程数没有限制,并且当非核心线程闲置时,会被立刻回收。这个线程池主要用于执行定时任务和具有固定时间周期的重复任务。

  • SingleThreadPool

通过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移动开发全套学习资料》送给大家,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
img
img
img
img

由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频
如果你觉得这些内容对你有帮助,可以添加下面V无偿领取!(备注Android)
img

学习福利

【Android 详细知识点思维脑图(技能树)】

其实Android开发的知识点就那么多,面试问来问去还是那么点东西。所以面试没有其他的诀窍,只看你对这些知识点准备的充分程度。so,出去面试时先看看自己复习到了哪个阶段就好。

虽然 Android 没有前几年火热了,已经过去了会四大组件就能找到高薪职位的时代了。这只能说明 Android 中级以下的岗位饱和了,现在高级工程师还是比较缺少的,很多高级职位给的薪资真的特别高(钱多也不一定能找到合适的),所以努力让自己成为高级工程师才是最重要的。

这里附上上述的面试题相关的几十套字节跳动,京东,小米,腾讯、头条、阿里、美团等公司19年的面试题。把技术点整理成了视频和PDF(实际上比预期多花了不少精力),包含知识脉络 + 诸多细节。

由于篇幅有限,这里以图片的形式给大家展示一小部分。

详细整理在GitHub点击可见;

Android架构视频+BAT面试专题PDF+学习笔记

网上学习 Android的资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。希望这份系统化的技术体系对大家有一个方向参考。

记](https://bbs.csdn.net/topics/618156601)**

网上学习 Android的资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。希望这份系统化的技术体系对大家有一个方向参考。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/不正经/article/detail/685778
推荐阅读
相关标签
  

闽ICP备14008679号