姚陆浩的博客

用文字构建一个理想的世界


  • 首页

  • 标签

  • 分类

  • 归档

  • 关于

  • 日程表

  • 搜索

ThreadLocal 的作用和实现原理

发表于 2018-07-21 | 分类于 ThreadLocal | | 阅读次数:

ThreadLocal 简介

这个类提供一个线程内部变量。通常情况下,我们创建的变量是可以被任何一个线程访问并修改的。而使用 ThreadLocal 创建的变量只能被当前线程访问,其他线程则无法访问和修改。

在日常开发中用到 ThreadLocal 的地方比较少,但是在某些特殊的场景下,通过 ThreadLocal 可以轻松地实现一些看起来很复杂的功能,这一点在 Android 的源码中也有所体现,比如 Looper、ActivityThread 以及 AMS 中都用到了 ThreadLocal。一般来说,当某些数据是以线程为作用域并且不同线程具有不同的数据副本的时候,就可以考虑采用 ThreadLocal。

ThreadLocal 使用

创建,支持泛型

1
ThreadLocal<String> mStringThreadLocal = new ThreadLocal<String>();
阅读全文 »

动态权限

发表于 2018-07-15 | 分类于 Android | | 阅读次数:

动态权限

动态权限又称运行时权限(高于 6.0 版本)。如果设备是运行在 Android 6.0 版本以上 —— app 的目标 sdk 版本是 23 以上时,在安装时,任何 app 权限用户都没有通知。在运行时,你的 app 必须请求用户授予危险权限,用户会看到一个系统弹窗(见下图左边)告诉用户,你的 app 正试图访问那个权限组。弹窗包括拒绝和允许按钮。

运行时权限弹窗

如果用户拒绝权限请求,下一次你的 app 请求权限,弹窗会包含一个复选框,当这个复选框被选中,表示了用户不想在提示这个权限(见上图右边)。

如果用户选中 Never ask again 并且点击 DENY,那么如果你之后试图请求相同的权限,系统将不再展示给用户。

及时用户授予即使用户授予您的应用程序所请求的权限,您也不能总是依赖它,用户还可以选择在系统设置中逐个启用和禁用权限,您应始终在运行时检查并请求权限以防止运行时错误。

阅读全文 »

Android 设计模式之六大原则

发表于 2018-07-07 | 分类于 Android , 设计模式 | | 阅读次数:

如何理解设计模式的六大基本原则

设计模式是一套理论,由软件界的先辈们总结出的一套可以反复使用的经验,它可以提高代码的可重用性,增强系统的可维护性,以及解决一系列的复杂问题。在做软件的时候,需求是最难把握的,我们可以分析现有的需求,预测可能发生的变更,但是我们不能控制需求的变更。既然需求的变更是不可控的,那如何拥抱变化呢?幸运的是,设计模式给了我们指导,出现了 6 大设计原则。

这六大设计原则分别是:

  • 单一职责原则 (Single Responsibility Principle,简称SRP )
  • 里氏替换原则 (Liskov Substitution Principle,简称LSP)
  • 依赖导致原则 (Dependence Inversion Principle,简称DIP)
  • 接口隔离原则 (Interface Segregation Principle,简称ISP)
  • 迪米特原则 (Law of Demeter,简称LoD)
  • 开闭原则 (Open Close Principle,简称OCP)
阅读全文 »

大尺寸图片加载

发表于 2018-06-30 | 分类于 Android , Bitmap | | 阅读次数:

通常情况下,图片的原始尺寸要比 ImageView 尺寸大,这时候把整张图片加载进 ImageView 会造成内存内存浪费,甚至造成 OOM (Out Of Memory Killer)。

在 Android App 中,为什么加载位图(Bitmap)是很棘手,是有很多原因的:

  • Bitmap 可以很轻松的消耗 App 的内存预算(Android 分配给每个 APP 的最大内存)。例如,Pixel 手机上的相机可拍摄高达 4048x3036 像素(1200万像素)如果 bitmap 配置使用 ARGB_8888(每个像素占 4 字节)—— Android 2.3(API 9 版本)及以上版本的默认值,将这张照片加载到内存中需要大约48MB 的内存(4048 * 3036 * 4 字节)。如此大的内存能够立即耗尽 App 可用的所有的内存。
  • 在 UI 线程中加载 bitmap 会降低你的 App 的性能,引发响应缓慢甚至发生 ANR (Application Not Responding) 的信息。因此,在使用 bitmap 时适当的管理线程是非常重要的。
  • 如果你的 App 正在加载多张 bitmap 到内存中,你需要熟练的管理内存和磁盘缓存。否则,你的 App 可能要忍受响应性和滑动性差的体验

多数情况下,我们推荐你在 App 中,使用 Glide 框架获得,解析展示 bitmap。在 Android中,Glide 抽象出来很多复杂的 bitmap 和其他图像和其他任务的相关工作。

然而,在使用开源框架的同时,我们仍然要明白一个像 Glide 这样优秀的框架要做哪些事情。

阅读全文 »

AndroidStudio build 过程

发表于 2018-06-22 | 分类于 Android , build | | 阅读次数:

文章来源:AndroidStudio Build过程解析

AndroidStudio 点击 build 按钮后,AndroidStudio 就会编译整个项目,并将 apk 安装到手机上,这个过程就是 Android 工程编译打包过程。主要的流程是

  1. 编译
  2. DEX
  3. 打包
  4. 签名

APK 构建概述

下图是谷歌官方给出的一个典型的 APK 构建过程。

典型 APK 构建过程

阅读全文 »

MVC、MVP和MVVM

发表于 2018-06-05 | 分类于 Android , 设计模式 | | 阅读次数:

在开启一个新的项目的时候,最头痛的莫过于设计程序架构。我的 App 需要设计架构吗?答案是肯定的,原因在于,随着 App 不断的更新迭代,功能会越来越多,在添加功能的时候就会将代码都其在一起,会导致代码堆积,不易查找,结果便是开发进度越来越慢,更严重的可能导致无法继续迭代。

由此看来,应用的架构设计尤为重要,好的架构会使开发变得健壮,稳定以及拥有更快的开发进度。经过大量的实践,Android 中广为人知的设计模式有 MVC、MVP 和 MVVM。

那么今天我们来总结一下这些架构的结构,优缺点和使用场景。

阅读全文 »

Android 面试题汇总

发表于 2018-06-04 | 分类于 面试题 | | 阅读次数:

前言

本篇文章为面试题总结,文中出现的知识可能比较零散,读者可以通过目录选择性阅读。

由于作者水平有限,难免会有疏漏的地方,如果您发现了不正确的地方,可以发送邮件(yaoluhao@sina.com)于我,收到邮件后,我会及时处理问题。

愿您能不吝赐教,吾定当感激涕零。

Android 横竖屏切换时 Activity 的生命周期

默认情况下,Activity 就会被销毁并且重新创建;另外,可以通过配置参数阻止系统重新创建 Activity。

横竖屏切换,系统配置发生改变,Activity 会被销毁并重新创建。

  • 销毁时
    • onPause、onStop、onDestroy 均会被调用,系统会调用 onSaveInstanceState 来保存当前 Activity 的状态。
    • onSaveInstanceState 调用时机在 onStop 之前,和 onPause 没有严格的顺序。
    • 注意:onSaveInstanceState 只有在 Activity 异常终止的情况下才会被调用,正常情况下系统不会调用这个方法。
  • 重建时
    • 系统调用 onRestoreInstanceState,并且吧 Activity 销毁时 onSaveInstanceState 方法所保存的 Bundle 对象作为参数同时传递给 onRestoreInstanceState 和 onCreate 方法。
    • onRestoreInstanceState 调用时机在 onStart 之后。
阅读全文 »

tcp 和 udp

发表于 2018-05-28 | 分类于 网络 | | 阅读次数:

网络的五层模型

对网络协议的划分有很多种,有七层的,有四层的,然而最普遍和最好理解的是网络协议的五层模型,它们分别是:

  • 物理层:就是把电脑连接起来的屋里手段。他主要规定了网络的一些电气特性,作用是负责传送 0 和 1 的电信号。
  • 数据链路层:
    • 数据链路层为网络层提供可靠的数据传输
    • 基本数据单位为帧
    • 主要的协议:以太网协议
    • 两个重要设备名称:网桥和交换机
阅读全文 »

Android 中的线程池

发表于 2018-05-27 | 分类于 Java , ThreadPool | | 阅读次数:

线程池的概念

线程池(thread pool):一种线程使用模式。线程过多会带来调度开销,进而影响缓存局部性和整体性能。而线程池维护着多个线程,等待着监督管理者分配可并发执行的任务。这避免了在处理短时间任务时创建与销毁线程的代价。线程池不仅能够保证内核的充分利用,还能防止过分调度。可用线程数量应该取决于可用的并发处理器、处理器内核、内存、网络sockets等的数量。 例如,线程数一般取cpu数量+2比较合适,线程数过多会导致额外的线程切换开销。

任务调度以执行线程的常见方法是使用同步队列,称作任务队列。池中的线程等待队列中的任务,并把执行完的任务放入完成队列中。

Android 中的线程池有哪些?

Android 中的线程池的概念来源于 Java 中的 Executor,executor 是一个接口,真正的线程池的实现为 ThreadPoolExecutor。ThreadPoolExecutor 提供了一系列参数来配置线程池,通过不同的参数可以创建不同的线程池。

阅读全文 »

Android 中的 AIDL

发表于 2018-05-20 | 分类于 Android , AIDL | | 阅读次数:

什么是 AIDL

AIDL(Android 接口定义语言)与你使用过的其他 IDL 类似。 它允许你在定义在客户端和服务器两端都识别的程序接口,为的是它们可以互相通过 IPC 机制通信。在 Android 中,一个进程正常情况下不能访问另一个进程的内存。换句话说,它们需要解析它们的对象成为操作系统能够理解的原始类型,并且为你序列化边界访问对象。代码的序列化操作编写是很繁琐的,因此 Android 为你用 AIDL 封装了它。

使用 AIDL 的注意事项

如果你允许通过 IPC 机制访问你的服务的是来自不同的应用客户端,并且需要在你的服务里处理多进程,使用 AIDL 才是有必要的。如果你不需要执行并发 IPC 访问不同应用,你应该创建实现了 Binder 的自定义接口,或者如果你需要执行 IPC 但是不需要处理多线程,这种情况下,使用 Messenger 实现你的接口。不管怎样,在实现 AIDL 之前,确保你理解绑定服务。

阅读全文 »
12…4
bleedyao

bleedyao

时间考验一切,经得起时间考验的就为人所信仰

31 日志
25 分类
12 标签
GitHub
© 2017 — 2018 bleedyao
由 Hexo 强力驱动
| |
主题 — NexT.Gemini v5.1.3