Timmy Ma

to infinity and beyond.


  • 首页

  • 关于

  • 标签

  • 分类

  • 归档

Android-Performance

发表于 2019-05-20 | 更新于 2019-06-04

资源类型能

包括 磁盘,CPU,内存,网络,电池

磁盘

避免主线程 IO

避免主线程操作文件和数据库

50% 以上卡顿问题都是由主线程 I/O 引起的

使用 apply() 代替 SharedPreference.commit()

apply() 是异步操作,commit()是同步操作

提前初始化 SharedPreference

在多进程和旧版本的 Android 中,初始化过程的 I/O 是在主线程的

减少 I/O 读写量

减少使用 SECLECT *

减少从数据库读取的数据量,减少耗时

利用缓存减少重复读写

内存缓存命中率极高,投入产出高

数据库减少使用 AUTOINCREMENT

因为要多操作一个表,所以 INSERT 好时减少 2~4 倍

使用合适的数据库分页

Sqlite 读写磁盘是以 page 为单位的,在 3.12 0 版本之前,Sqlite 默认 page 大小是 1KB,从 3.12.0 版本开始,page 大小是 4KB

频繁查询的表使用索引

缩阴可以极大的减少读磁盘的数据量,极大地提升效率

避免无效索引

无效索引的问题通常是严重的。除了出发全表扫描,产生大量的容与读写之外,还降低了写入性能

减少 I/O 操作次数

使用 8KB Buffer 读写

可以减少 2~3 倍耗时

批量更新数据库使用事务

启用事务,根据业务规模,会大量减少 I/O 读写量和操作次数,从而提升效率

ZIP 压缩大量小文件时建议使用 ZipInputSteam

内存

Android Jetpack - ViewModel

发表于 2018-07-13 | 更新于 2018-07-17 | 分类于 Android JetPack

ViewModel Overview

ViewModel 类旨在以生命周期意识的方式存储和管理 UI 相关数据。 ViewModel 类允许数据在配置更改之后(例如屏幕旋转)后继续存在。

Android 框架管理着 UI controller 的生命周期,例如 Activity 和 Fragment ,框架可以决定创建或是重新创建 UI controller 以响应不受您控制的某些用户操作或设备事件。

如果系统销毁或重新创建 UI controller ,你在其中存储的任何的顺势的数据都将会丢失。例如,你在 Activity 中存储了一个 User 列表。当这个 Activity 因为配置变更而重建时,新的 Activity 必须得重新请求用户列表。简单来说, Activity 可以使用 onSaveInstanceState() 方法、并在 onCreate() 中的 bundle 中获取数据,但是这也仅限于小数据量的可以序列化和反序列化的数据,大量的 User 数据或是 Bitmap 就不行了。

另一个问题就是 UI controller 要频繁的进行异步请求,需要时间来等待返回结果。 UI controller 需要管理这些调用,并在系统清理现场的时候避免潜在的内存泄漏。这种管理工作需要维护大量代码,并且在这种情况下数据对象会被重新创建,对于已经调用并创建的对象来说重建他们是一种资源浪费。

诸如 Activity 和 Fragment 这样的 UI controller 主要用于显示 UI 数据,对应互操作进行响应或是处理跟操作系统的交互,例如申请权限。用 UI controller 来负责请求数据库,会让类越来越臃肿。为 UI controller 分配过多的任务可能会导致最后一个类处理了所有的工作,而不是委托给其它类。这样也会更加难以测试代码。

将视图数据与 UI controller 分离开会更简单、更有效。

阅读全文 »

Android JetPack - LiveData

发表于 2018-07-11 | 分类于 Android JetPack

LiveData overview

LiveData 是一个 observable 数据的持有类。与通常的 observable 不同的是, LiveData 具有生命周期意识,意思就是它遵循其他应用组件的生命周期,例如 activity , fragment , service 。这就可以确保 LiveData 仅在应用组件处于活跃状态的时候更新 observer 。

LiveData 可以被认作是观察者,并且仅在它的生命周期处于 STARTED 或者 RESUMED 的时候活跃。 LiveData 仅通知活跃的观察者。已注册但是处于非活跃状态的观察者不会收到通知。

你可以注册与实现了 LifecycleOwner 接口的对象相匹配的观察者。这种关系允许在相应的 Lifecycle 对象更改为 DESTROYED 的时候移出观察者。这对于 Activity 和 Fragment 特别有用,因为他们可以安全的观察 LiveData 对象而不用担心内存泄漏 - 因为 Acticity 和 Fragment 在其生命周期被销毁的时候会取消订阅。

阅读全文 »

Android JetPack - Lifecycles

发表于 2018-07-10 | 分类于 Android JetPack

管理 activity 和 fragment 的生命周期
参看 https://developer.android.com/topic/libraries/architecture/lifecycle

使用生命周期感知组件来处理生命周期

生命周期感知组件执行操作来响应另一个组件(例如 Activity 或 Fragment )的生命周期变更。这些组件可以帮你写出更易于组织更轻量级更易于维护的代码。

一种常见的模式就是在 Activity 和 Fragment 的生命周期方法中实现相关的操作。但只这种模式会导致代码组织不良和各种错误。通过使用生命周期感知组件,你可以将组件代码移出生命周期的方法,并且放到组件当中去。

阅读全文 »

Android Jetpack - Data Binding

发表于 2018-07-09 | 更新于 2018-07-10 | 分类于 Android JetPack

以声明的方式将 observable 数据绑定到 UI 元素
参考 https://developer.android.com/topic/libraries/data-binding/

Get started

添加 dataBinding 元素到项目中 app moudule 的 build.gradle 文件中:

1
2
3
4
5
6
android {
...
dataBinding {
enabled = true
}
}

Layouts & binding expressions

使用 Databinding 的 layout 文件与正常的略微有些不同,它使用了 layout 作为 root tag ,里面包裹着 data 元素和真正的 view 元素:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
<?xml version="1.0" encoding="utf-8"?>
<layout xmlns:android="http://schemas.android.com/apk/res/android">
<data>
<variable name="user" type="com.example.User"/>
</data>
<LinearLayout
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="match_parent">
<TextView android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@{user.firstName}"/>
<TextView android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@{user.lastName}"/>
</LinearLayout>
</layout>

其中data 标签包裹着的变量 “user“ 即为当前 layout 所使用的属性:

1
<variable name="user" type="com.example.User" />

在使用该属性的表达式中,使用 “@{}“ 的语法来表示引用,这里, TextView 的文字被设置为 user 的 firstName 属性:

1
2
3
4
<TextView 
android:layout_width="wrap_content"
android:layout_height="wrap_content"
ndroid:text="@{user.firstName}" />

表达式应该尽可能的简洁,因为他们不能被单元测试。如果想要简化复杂的表达式,可以使用 Binding adapters。

阅读全文 »

Kotlin Bootstrap

发表于 2017-05-23 | 更新于 2018-07-10 | 分类于 Kotlin

May 17, 2017, at the Google I/O keynote, the Android team announced first-class support for Kotlin.

Android团队已经宣布为 Kotlin 提供 “first-class support”
Kotlin 官网上对应 Android 的 tutorial
Android Developers 官网上对应 Kotlin 的 start up

现在就橹一遍 “hands-on” learning 吧
希望不会像 Swift 那样

阅读全文 »

Hello World

发表于 2016-09-17

Welcome to Hexo! This is your very first post. Check documentation for more info. If you get any problems when using Hexo, you can find the answer in troubleshooting or you can ask me on GitHub.

Quick Start

Create a new post

1
$ hexo new "My New Post"

More info: Writing

Run server

1
$ hexo server

More info: Server

Generate static files

1
$ hexo generate

More info: Generating

Deploy to remote sites

1
$ hexo deploy

More info: Deployment

T.M. Ma

T.M. Ma

just some notes
7 日志
2 分类
5 标签
© 2016 – 2019 T.M. Ma
由 Hexo 强力驱动 v3.8.0
|
主题 – NexT.Pisces v7.1.1