Liping Zou bio photo

Liping Zou

An Android Developer

Email Twitter Instagram Github Stackoverflow

All Posts

2021

Google Pay 踩坑之路

首次接入 Google Pay 走了不少弯路,遇到很多奇奇怪怪的问题,在此将接入 Google Pay 的历程做个总结与回顾。下文主要围绕两个方面,接入流程和遇到的问题。接入流程主要参考 Google 官方文档,结合服务端校验订单。遇到的问题主要包含商品获取异常、无法完成购买、消费状态异常等等。

使用 MotionLayout 实现展开折叠动画

MotionLayout 是 ConstraintLayout 的子类,可以用于布局的状态转换添加动画效果。本文介绍了如何使用 MotionLayout 实现展开折叠动画。

2019

从一个小 bug 回顾 View 的测量

从一个上线前的流式布局 FlowLayout 小 bug 入手回顾一下 View 的 measure。

一次诡异的不能点击的事件

很久以前的某一天,忽然收到反馈,搜索结果的列表中有些项目不可点击,并且这些项目是没有规律的。看到这个反馈的第一反应是这不可能,每个 Item 的点击事件都是统一处理的,不可能出现某些能点某些不能点的问题。抱着怀疑的态度,准备去 Review 代码,一步一步排查,尝试定位问题所在。

2018

2018

又到了一年一度回顾的季节了,已经隔了好几年不写年记了,今年回归啦。翻看这一年的社交网络的记录,越发少的在公开场合发表任何心得,越来越难以回忆起这一年的点滴瞬间,生活越显寡淡。

Weex 初体验

最近在 Vue、HTML、CSS 几乎小白的情况下,接到了一个 Weex 页面需求,于是乎开始了 Weex 的学习,遇到了一些坑,在这里做一些总结。Weex 是阿里开源的一个「使用 Web 开发体验来开发高性能原生应用的框架」,号称「Write Once, Run Everywhere」。

Kotlin 初体验

Kotlin 是 JetBrains 公司(著名的 IntelliJ IDEA 正是由这家公司开发的,Android Studio 也是基于 IDEA 的)在 2011 年推出的在 JVM 上运行的静态类型编程语言,2016 年发布了第一个稳定版本, 2017 年 Google I/O 上被 Google 定为 ...

2015

2015

不知不觉中,已经走到了 2015 的尾巴。在各个隐藏角落,找寻 2015 的痕迹,将一点一滴的回忆拼凑起来,组成了这个篇章。

Android Night Mode 夜间模式实现

最近有个需求是夜间模式,在实现之前肯定得看看官方文档有没有相关的 tips,结果真的有。Providing Resources 这一节提到了夜间模式可以用 UiModeManager 实现,这是个令人高兴的事情。那么这就是方法一了。提到夜间模式,想起最近很火的知乎夜间模式,在知乎上搜索一番,看见了几个问题,知乎安...

Materialize Your APP

很久以前就想写这篇文章了,Android Lollipop 已经发布这么久了,迟迟没有整理,一直拖到了现在。肯定得说的是 Material Design。所谓 Material Design,直接引用官方的文档,还是不翻译了。

2014

2014,活着

年年岁岁,岁岁年年,又到了省视自己的时刻。每每觉得不舍,时光匆匆流走,留下一丝丝念想。2014,最重要的分水岭,走向了另一个阶段。2014年的尾巴,如期而至。按照惯例,是时候回顾我这平凡的一年了,酸甜苦辣,种种滋味。一笔一划都那么艰难,写下多少又删去更多。

Android LoaderManager的使用

在Android中实现数据的加载,总的来说有两种方式。一种是开发者利用AsyncTask(当然,也可使用Thread + Handler的方式,仅以AsyncTask作代表)在新的线程中开启数据库,读取数据,在数据读取完毕后刷新页面,展示数据。这种方式简单易懂,实现起来容易,但有点繁琐,需要开发者手动管理SQLi...

SQLite常见异常详解

从开始写Android开始到现在,总觉得SQLite就那么回事嘛,不就是各种query、insert之类的操作,写好SQL语句就可以了。直到遇到现在做的这个项目,才发现关于SQLite,我没踩过的坑还那么多。本文正是来源与此,将一一阐述这些日子对于SQLite的重新认识。

Android Search Dialog记录搜索历史

在[上一篇博客](http://echo.vars.me/android/2014/08/14/search/)的基础之上,使用Search Dialog来记录搜索的历史。记录用户的搜索记录可以提高用户搜索的效率,例如在用户搜索过`test`后,用户输入了`t`,将用户搜索过的以`t`开头的词`test`显示出来。

Android Search Dialog and Search Widget使用

Search Dialog是一个android系统能够控制的组件,只能放置在Activity的顶部。Search Widget是SearchView的一个实例,可放置在Activity的任意位置。仅在Android 3.0以后才可使用。当用户执行一个搜索时,系统将查询提交给开发者指定的查询执行的Activity,...

NDK之Java调用C流程

本文主要阐述如何使用Java来调用C的流程。

NDK在Mac OS X下的安装配置

JNI是Java Native Interface,用来沟通Java代码和C/C++代码的桥梁。通过JNI,Java代码可以调用C/C++代码,且C/C++代码也可以回调Java代码。为什么使用JNI?一般是以下几个原因

NDK之C回调Java流程

本文主要描述了使用C来回调Java的流程。

NDK基础

NDK基础

2013

2013,在迷雾中跳舞

2013,意味着一切大不同。2013,意味着变轨。2013,终于到了说再见的时刻。回望过去的三年,一点一滴的变化,在经意与不经意间,悄然到来。

Jena API详解(关注本体持久化到MySQL后的操作)

关于Jena的简介在很多博客中都能看到,例如[对Jena的简单理解和一个例子](http://imarine.blog.163.com/blog/static/51380183200812774739130/),[使用Jena将本体存入MySQL](http://imarine.blog.163.com/blog...

C/C++位运算技巧

对于位运算,大家都很熟悉,基本的位操作有与、或、非、异或等等。在面试中经常会出现位运算相关的题,所以我就做了简单的整理,参考了很多写的很好的博客及书籍。现在简单说一下,移位运算。

线性排序算法(计数排序,基数排序,桶排序)分析及实现

大家都知道的是,基于比较的排序算法的时间复杂度的下界是 O(n log(n))。这一结论是可以证明的,所以在基于比较的算法中是找不到时间复杂度为 O(n)的算法的。这时候,非基于比较的算法,如计数排序、基数排序和桶排序,是可以突破这个下界的。但是,非基于比较的排序的使用限制却是较多的,如计数排序仅能对较小整数进行...

链表基础

链表是一种很常见的数据结构,在每个节点都保存了指向下一个节点的指针。与顺序表相比,链表插入元素的复杂度是O(1),查找一个节点或者访问特定节点编号的元素的复杂度是O(n);顺序表插入元素的复杂度是O(n),而查找的复杂度是O(1)。使用链表可以不必事先知道数据的大小,但是增加了指针域,加大了内存的开销。链表有三种...

二叉树的建立(根据遍历结果构建)、遍历(非递归)和搜索

二叉树的每个节点至多只有两棵子树,二叉树的子树有左右之分,不可颠倒。二叉树的第i层至多有2^(i-1)个节点;深度为k的二叉树的节点至多有2^k - 1个节点;对任一个二叉树,其叶子节点的个数为n,度为2的节点个数为m,n = m + 1 。(摘自wiki)

内存管理:分页,分段,段页结合

进程是操作系统资源分配的最小单元。操作系统分配给进程的内存空间中包含五种段:数据段、代码段、BSS、堆、栈。

进程与线程;同步与互斥:事件,信号量,临界区,互斥量

进程是操作系统资源分配的基本单位。进程中代码执行的一个序列。线程是操作系统可以进行运算调度的基本单位。

几种常用的排序算法的分析及java实现(希尔排序,堆排序,归并排序,快速排序,选择排序,插入排序,冒泡排序)

每个排序的写法格式基本按照先介绍基本思想,再描述具体过程,最后是具体代码。关于复杂度等问题后续更新。如有写的不严谨的地方,欢迎指出,相互交流。

嵌套Fragment的使用及遇到The specified child already has a parent. You must call removeView()问题的解决

嵌套Tab在Android应用中用途广泛,之前做过的一些东西都是运用了TabActivity。但是由于在Android Developers中说到了“TabActivity was deprecated in API level 13." ,并且建议大家使用Fragment。

2012

内核级线程

不知不觉已经是最后一次的实验了。这一次实验的内容是:在Ubuntu下编写多线程的应用程序memtest.c,解决一个可并行运算的问题。在Linux 0.11的进程管理基础上,按照POSIX Threads标准实现内核级线程,使其能支持memtest.c的运行

2012札记

就这样,漫无目的,晃晃悠悠,走到了2012年的尾巴。文字记录下的点滴,珍藏的瞬间,跃然纸上,跃然心头。写文字的好处,即使记忆被时光冲刷的看不清了痕迹,我还是可以找到点点印迹。

proc 文件系统的实现

第七次实验的内容是在Linux 0.11上实现procfs(proc文件系统)内的psinfo结点。当读取此结点的内容时,可得到系统当前所有进程的状态信息。例如,用cat命令显示/proc/psinfo的内容

字符显示与控制

第六次实验可以算是很简单的一次了,只要知道了0.11如何响应你的键盘事件,一切问题都迎刃而解了。实现这个实验的方法有很多,我的也是仅供参考,其他方法可能还有些是涉及到修改汇编代码的。

地址映射与共享

本次已经是OS的第五次实验了,这次要做的内容有:用Bochs调试工具跟踪Linux 0.11的地址翻译(地址映射)过程,了解IA-32和Linux 0.11的内容管理机制。

Java实现C语言语义分析(递归下降)

说起这次的语义分析,不得不说的是我的重大的改变。上一次的语法分析是利用了预测分析法来实现的,经过多方考证,发现用预测分析法的语法分析器基础来实现语义分析的困难重重,例如在语法指导翻译的时候那个栈的变化和各种属性的传递就已经让我头晕脑胀了。无奈之下,只好重写语法分析,用了递归下降来实现语法分析进而实现我的语义分析。

信号量的实现和应用

第四次实验是一道坎啊,话说当年差点没做出来,各种纠结的问题都出现了。这一次的实验涉及到前几次实验的小综合,所以要求有点高。建议一定要认真仔细多阅读几遍指导书。

进程运行轨迹的跟踪与统计

在做这次实验的时候,一定要耐心一点。我当时做的时候就因为在修改的过程中出现了一点小小的失误,导致了整个实验重新来过一遍。为了避免这样的情况发生,一定要记住修改的时候,要注意修改的内容无误。

Python实现的C语言词法分析

词法分析器的功能是输入源程序,输出单词符号。当初定义Token(单词种别,属性值)序列的时候,是将单词种别用数字来表示,后来再做语法分析的时候,发现用数字时不太合理的,所以又对单词的种别码进行了一番修改。

系统调用

操作系统的第二个实验是在0.11下添加两个系统调用,iam 和 whoami.

Java实现C的语法分析器(预测分析法)

在上一次词法分析的基础之上,我完成了我的C语言的语法分析器。这次选择的是用Java来实现,采用了自顶向下的分析方法,其思想是根据输入token串的最左推导,试图根据现在的输入字符来判断用哪个产生式来进行推导。