DAYS

静坐常思己过,闲谈莫论人非。知事不伸张,知人不评人,知理不争理。

0%

在讲 LZW 在 GIF 中的应用前,有必要先简单的过一下 LZW 算法。

LZW算法又叫“串表压缩算法”就是通过建立一个字符串表,用较短的代码来表示较长的字符串来实现压缩。 LZW压缩算法是Unisys的专利,有效期到2003年,所以对它的使用已经没有限制了

在上面的介绍中,关键在于字符串表这一概念,为了简单理解,我举一个例子(此例子并不是完全使用的 LWZ 算法,但思想是一致的)。

阅读全文 »

最近花了点时间用 C++ 写了一个 GIF 图片的解析程序,在这一过程中我找了许多中文相关的材料,但没有哪一篇是真正能够让读者完全理解 GIF 的文件格式和 LZW 在 GIF 中的应用(解析部分)。在查阅了一些官方文档后我算是顺利的将程序完成了,顺道我就把 GIF 文件的解析在这儿讲讲清除,方便大家学习。

下面这两个网页是我参考的比较权威的资料,大家也可以直接阅读。

http://giflib.sourceforge.net/index.html
https://www.w3.org/Graphics/GIF/spec-gif89a.txt

阅读全文 »

gif

最近花了点时间用 C++ 写了一个 GIF 图片的解析程序,在这一过程中我找了许多中文相关的材料,但没有哪一篇是真正能够让读者完全理解 GIF 的文件格式和 LZW 在 GIF 中的应用(解析部分)。在查阅了一些官方文档后我算是顺利的将程序完成了,顺道我就把 GIF 文件的解析在这儿讲讲清除,方便大家学习。

下面这两个网页是我参考的比较权威的资料,大家也可以直接阅读。

http://giflib.sourceforge.net/index.html
https://www.w3.org/Graphics/GIF/spec-gif89a.txt

阅读全文 »

此指南适用于那些曾经或现在进行Android应用的基础开发,并希望了解和学习编写Android程序的最佳实践和架构。通过学习来构建强大的生产级别的应用。

注意:此指南默认你对Android开发有比较深的理解,熟知Android Framework。如果你还只是个Android开发新手,那么建议先学习下Android的基础知识。

阅读全文 »

持久库Room

Room在SQLite上提供了一个抽象层,以便在利用SQLite的全部功能的同时使流畅的数据库访问。

需要处理一些重要的结构化数据的App通常会从本地的持久数据中受益匪浅。最常见的就是使用本地缓存,这样的话下次如果设备无法联网用户也能浏览本地数据并进行更改。等下次联网后再和服务器进行同步。

Android的Framework为了支持处理原始SQL而提供了SQLite这一强大的API,当时SQLite的API还是相对比较低级,在使用的时候需要花费大量的经历:

  • 没有对原始SQL语句的编译时验证,随着数据库表格的更改,你需要更新相关SQL操作,而这个过程可能耗时且容易出错。
  • 你需要使用大量的样板代码在SQL查询和Java数据对象之间进行转换。

Room在为SQL提供抽象层的同时也会考虑到上述的问题。

阅读全文 »

ViewModel

像Activity,Fragment这类应用组件都有自己的生命周期并且是被Android的Framework所管理的。Framework可能会根据用户的一些操作和设备的状态对Activity或者Fragment进行销毁和重构。作为开发者,这些行为我们是无法干预的。

所以Activity或Fragment中的一些数据也会随着销毁而丢失,随着重构而重新生成。比如你的Activity中有个用户列表,当这个Activity重构的时候,新的Activity会重新获取用户列表。对于一些简单的数据,Activity可以使用onSaveInstanceState()方法,并从onCreate的bundle中重新获取。但这一方法途径仅仅适合一些简单的UI状态,对于用户列表这种庞大的数据并不适合。

阅读全文 »

LiveData

LiveData是一个用于持有数据并支持数据可被监听(观察)。和传统的观察者模式中的被观察者不一样,LiveData是一个生命周期感知组件,因此观察者可以指定某一个LifeCycle给LiveData,并对数据进行监听。

如果观察者指定LifeCycle处于Started或者RESUMED状态,LiveData会将观察者视为活动状态,并通知其数据的变化。

阅读全文 »

前言

各位码友不知道有没有发现,不知道从何时,Android Studio的Gradle构建系统就已经把Jcenter作为默认的远程仓库了,如下:

1
2
3
4
5
6
7
8
buildscript {
repositories {
jcenter()
}
dependencies {
classpath 'com.android.tools.build:gradle:2.1.2'
}
}

而这样做的好处就是我们只需要在dependencies脚本块中加入对应lib即可使用远程仓库,而不需要再像eclipse那样苦苦寻找jar包。

阅读全文 »