自定义视图及其性能

线程性能

性能中很关键的一点就是多线程的使用.Android 中很多事件只能在主线程中执行,比如 输入事件,应用程序回调服务,警报等等.

这意味着这些事件会形成一个阻塞队列,这些任务会依次按顺序执行.然而UI 渲染也是在主线程中的,而他们每 16ms 就会渲染一次,来达到一个平滑的过渡,但是如果有大量的其他任务堆积在主线程中,可能会导致你错过某一个 16ms 的渲染机会,导致丢帧的情况.

为了处理这种情况,我们可以把一些耗时较长的任务转移到其他线程处理,这样主线程就能够更快的响应了.Android 中提供了一些有助于这个目的的类.

  • AsyncTask : 帮助你区分 UI 线程和非 UI 线程的工作
Read More

Android 模块依赖版本管理

Android 模块依赖版本管理

由于 Android 模块化的需要,依赖库要保持统一,但是每次一旦某个模块版本变动,就要手动修改所有模块的版本号未免显得有些繁琐,而且有一些共用的模块可能在不同的项目中要使用不同的版本.所以需要一个统一管理版本模块的方法.

步骤

1. 在项目主目录下新建一个名为 dependency.gradle 的文件

2. 在该文件写入配置信息

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
ext {
ext.deps = [:]
def deps = [:]
// 统一的版本号管理
def versions = [:]
versions.kotlin = "1.3.70"
versions.android_gradle_plugin = "3.5.2"
versions.appcompat = "1.1.0"
versions.dagger = "2.16"
versions.material = "1.2.0-alpha03"
versions.work = "2.3.0-alpha01"
versions.retrofit = "2.3.0"
versions.recyclerview = "1.1.0"
versions.okhttp = "3.0.1"
versions.guava = "20.0"
versions.navigation = "2.3.0-alpha01"
versions.multidex = "1.0.0"
//------------------------------------------------------------------------------
// 一组依赖可以使用这个方式
def navigation = [:]
navigation.runtime = "androidx.navigation:navigation-runtime:$versions.navigation"
navigation.runtime_ktx = "androidx.navigation:navigation-runtime-ktx:$versions.navigation"
navigation.fragment = "androidx.navigation:navigation-fragment:$versions.navigation"
// 这句要记得
deps.navigation = navigation
...
// 单个依赖可以使用这中方式
deps.app_compat = "androidx.appcompat:appcompat:$versions.appcompat"
// app 本身的版本管理也可以放进来
def build_versions = [:]
build_versions.min_sdk = 19
build_versions.compile_sdk = 29
build_versions.target_sdk = 29
build_versions.build_tools = "29.0.3"
ext.build_versions = build_versions
ext.deps = deps
}

如上图所示,配置文件就完成了

3. 使用

在 root 目录下的 build.gradle 中加上 apply from: "dependency.gradle"

在需要添加依赖的 Module 中使用,如下

Read More

Gradle Kotlin DSL

Gradle Kotlin DSL

[TOC]

我觉得你们可以先看最后的彩蛋再决定是不是要看

强烈推荐先看文章最后的彩蛋!!!

为什么选择 Gradle Kotlin DSL

首先我们要先明确我们这么做的原因有哪些?是否值的我们从 groovy 迁移到 kotlin.

Kotlin 相比于 Groovy 有这么几个好处:

Read More

工具 严格模式

Tool: Strict Mode

[TOC]

背景

当你的应用中的事件处理超过了 5 秒钟没有响应的时候,Android 会弹出一个 ANR 弹窗. 这是因为 UI 线程被阻塞了,它在等待某些事情的完成.因为 UI 线程是唯一一个可以处理输入和绘制的线程,当它停止响应的时候,你的 app 也停止了响应.

那么什么会导致 UI 线程像这样停止呢?通常情况下系统调用可以无期限的阻塞它,就像磁盘或者网络获取.这些阻塞调用是你应用中的定时炸弹.在正常情况下,它们运行的非常快,你甚至无法注意到他们.但在某些软件和硬件条件以及一些运气的情况下,他们爆炸了.

方案

接下来我们来介绍一下如何找到这些隐藏的问题.这个工具的名字叫 Strict Mode ,你可以在 开发者模式中勾选上 Strict Mode Enabled 来启动它.当它是启动的时候,在你的应用中如果有在 UI 线程中的耗时操作的时候屏幕的边框会变成红色的.

Strict Mode 实际上定义了你在什么线程中可以做什么事,它有点像一个运行时的 Lint . 它是对你的线程策略做了一个规定,策略是由两个部分呢组成的

Read More

自定义视图及其性能

Custom Views and Performance

Android 平台自带了很多标准控件,但是你总会发现有无法满足你的需求的时候,这时候你可以使用自定义控件.自定义控件是很容易的,困难的是怎么让自定义控件的性能表现良好.这里将会介绍一些会导致自定义控件表现变差的原因.

  • 在没有改变的时候仍然调用了 onDraw()
  • 耗费时间和资源绘制根本不会再界面上展示的像素.比如被遮挡住的部分
  • 我们还可以在 onDraw 中花很长的时间
Read More

LeetCode 9. Palindrome Number

[English ver]

9. Palindrome Number

Determine whether an integer is a palindrome. Do this without extra space.


click to show spoilers.

Some hints:
Could negative integers be palindromes? (ie, -1)

Read More

LeetCode 9. Palindrome Number

9. Palindrome Number

判断一个整数是不是一个回文。不要使用额外的空间。


提示:
负整数可以是回文吗?(比如-1)

如果你想要将整数转换成字符串,注意使用额外的空间的限制。

你还可以尝试反转整数。然而,如果你已经解决了”Reverse Integer” 这个问题,那你应该知道反转一个整数可能会造成溢出。你要如何处理这种情况?

Read More

Navigation 指南

Navigation 指南

[TOC]

由于官网暂时没有中文版本,所以在这里根据内容抽空做了一些中文的版本.

Navigation 是用来管理你的app中内容的跳转,返回等操作.它主要包含了以下三个部分:

  • Navigation graph : 一个 xml 资源包含了所有的导航相关的信息. 这些信息包含了你app里所有独立的内容区域,也就是 destinations .
Read More

开始使用 Navigation

开始使用 Navigation

[TOC]

由于官网暂时没有中文版本,所以在这里根据内容抽空做了一些中文的版本.

开始使用

依赖引入

1
2
3
4
5
6
dependencies {
def nav_version = "2.1.0-alpha05"
implementation "androidx.navigation:navigation-fragment:$nav_version" // For Kotlin use navigation-fragment-ktx
implementation "androidx.navigation:navigation-ui:$nav_version" // For Kotlin use navigation-ui-ktx
}

最新版本清关注官方版本 https://developer.android.google.cn/jetpack/androidx/releases/navigation#declaring_dependencies

创建一个导航图

Navigation 发生在 app 内目的地之间的跳转.这些目的地通过action 进行连接.

Read More

使用 Lint 来获取性能贴士

使用 Lint 来获取性能贴士

[TOC]

背景

当我们在编写 Android 代码的时候如何能够快速优化我们的代码呢?

Android 为我们提供了一个 Lint 的工具,它可以静态检验出我们代码里的很多问题.风格,内存泄露,过度绘制等等…

使用方法

在 Android studio 的菜单中选择 Analyse -> Inspect Code 就可以进入检查页面了.

他还可以在设置里的 Editor -> Inspections 中设置提示的等级,以及自定义检查项,可以说是非常好用的功能了.

Read More
Your browser is out-of-date!

Update your browser to view this website correctly. Update my browser now

×