October 29, 2016

软键盘监听工具类

package com.che.chatdemo.ui;

import android.app.Activity;

import android.graphics.Rect;

import android.view.View;

import android.view.ViewTreeObserver;

/**

* 软键盘监听工具类

* <p>

* 作者:余天然 on 16/8/26 下午4:56

*/

public class SoftKeyBoardListener {

private View rootView;//activity的根视图

int ......

October 29, 2016

应用版本工具类

package com.che.chatdemo.ui;

import android.content.Context;

import android.content.pm.PackageInfo;

import android.content.pm.PackageManager;

/**

* 应用版本工具类

* <p>

* 作者:余天然 on 16/8/26 下午6:09

*/

public class VersionUtil {

//返回程序版本号

public static int getVersionCode(Context context) ......

October 29, 2016

OkHttp实现全局过期token自动刷新

遇到问题:

当前开发的 App 遇到一个问题:

当请求某个接口时,由于 token 已经失效,所以接口会报错。

但是产品经理希望 app 能够马上刷新 token ,然后重复请求刚才那个接口,这个过程对用户来说是无感的。

也就是静默自动登录,然后继续请求:

请求 A 接口-》服务器返回 token 过期-》请求 token 刷新接口-》请求 A 接口

要实现上述需求的话,大家会如何实现呢?

解决方案:

思路:

1.通过拦截器,获取返回的数据

2.判断token是否过期

3.如果token过期则刷新token

4.使用最新的token,重新请求网络数据

/**

......

October 29, 2016

Guava字符串处理:连接,拆分,匹配,格式

这里,Guava将常用的字符串处理设计了4种角色:连接器、拆分器、匹配器、格式器,很方便我们自己拓展,强大!

感觉Guava采用的Fluent风格还是不错的,和RxJava的使用有点像,链式调用,阅读性很好,可以好好学习下。

废话少说了,上代码:

package com.che.baseutil.guava.string;

import com.google.common.base.CaseFormat;

import com.google.common.base.CharMatcher;

import com.google.common.base.Joiner;

import ......

October 29, 2016

友盟分享的那些坑

1.新浪分享的授权失败,redirect_url与应用注册的网址不一致

原因:授权回调页未填写

October 29, 2016

Java与js交互

一、利用重写的链接:

October 29, 2016

AndroidStudio使用备忘

快捷键

查看该方法的所有引用处 Alt+Fn+F7

代码提示 Alt+Enter

包裹代码,提示try/catch等 Cmd+Alt+T

代码格式化 Cmd+Alt+L

提取局部变量为全局变量 Cmd+Alt+F

全局查找字符串 Cmd+Shift+F

提取变量为常量 Cmd+Alt+C

#1.错误提示

> Alt+Enter

2.代码格式化

Cmd+Alt+L

3.打开最近的文件

Cmd+E

4.查找文件

双击:Shift

5.返回上次编辑的地方

Cmd+Shift+E

6.复制当前行

Cmd+D

7.剪切当前行

Cmd+X

8.......

October 29, 2016

Python基本语法

防止乱码

# coding=utf-8

print "Hello Python"

1-变量

a=12

b=23

c=a+b

print c

2-判断语句

score=67

if score>=90:

print "优秀"

elif score>=60:

print "及格"

else:

print "不及格"

#3-循环语句

for i in range(0,10,2):

print ("Item {0} {1}".format(i,"Fishyer"))

#4-函数

def say():

print ("我在说话")

def ma......

October 29, 2016

Activity备忘

1.生命周期

Activity的生命周期

补充说明:

2.启动模式

standard:标准模式

每次都会创建新的实例

适用于一般页面

singleTop:栈顶复用模式

如果目标Activity在栈顶,则不新建,调用原有的onNewIntent()方法;

如果目标Activi......

October 29, 2016

Context备忘

Context继承关系

Context使用场景

October 29, 2016

8种ScaleType

演示图

October 29, 2016

TextView备忘

1.字符串资源里变量替换

在android中有这样一个东西,那就是 XLIFF,全称叫 XML 本地化数据交换格式,英文全称 XML Localization Interchange File Format。

用例:

<string name="welcome">你好%1$s,欢迎使用我们的App。</string>

String welcome = getString(R.string.welcome, "小丸子");

把字符串打印出来如下:

October 29, 2016

ProGuard备忘

ProGuard的4种功能:

压缩(Shrink) 移除代码中无用的类、字段、方法、和特性

优化(Optimize) 对字节码进行优化,移除无用的指令

混淆(Obfuscate) 使用剪短无意义的名称对类、字段、方法重命名

预检(Preveirfy) 在Java平台上对处理后的代码进行预检

ProGuard的工作原理

ProGuard由Shrink,Optimize,Obfuscate,Preveirfy四个步骤组成,其中每个步骤都是可选的

编写ProGuard文件

1.基本指令

代码混淆压缩比,在0~7之间,默认为5,-optimizationpasses 5

......

October 29, 2016

5种手势工具类

1.ViewConfiguration-视图标准类

1.1.对象方法

ViewConfiguration viewConfiguration=ViewConfiguration.get(context);

//获取touchSlop。该值表示系统所能识别出的被认为是滑动的最小距离

int touc......

October 29, 2016

View的手势分发

1.Touch事件分发流程

Touch事件分发流程

特别提醒:

View是没有onInterceptTouchEvent拦截方法的

一般情况下,View都会消耗事件(onTouchEvent返回true),除非它们是不可点击的(clickable和longClickable都为false)......

October 29, 2016

9种Interpolator

Interpolator 被用来修饰动画效果,定义动画的变化率,可以使存在的动画效果accelerated(加速),decelerated(减速),repeated(重复),bounced(弹跳)等。

1.Linear Interpolator / 线性插值器

公式: y=t

2.Acceler......

October 29, 2016

16种Xfermode

下图以黄圆为dest,蓝矩为src,展示了各种图片混合模式:

图片混合模式

这里以mosaicBitmap为dest,以touchBitmap为src, 设置DST_IN模式:在相交处取dest

canvas.drawBitmap(mosaicBitmap, 0, 0,paint);//dest

pain......

October 29, 2016

SQLite备忘

一、常用语言:

1.数据操作语言(DDL):

select --从数据库表中检索数据行和列

insert --向数据库表添加新数据行

delete --从数据库表中删除数据行

update --更新数据库表中的数据

2.数据定义语言(DML):

create table --创建一个数据库表

drop table --从数据库中删除表

alter table --修改数据库表结构

create view --创建一个视图

drop view --从数据库中删除视图

create index --为数据库表创建一个索引

drop index --从数据库中删除索引

create......

October 29, 2016

3种计时器实现方法

目标:每隔一秒,发送一个事件

1.Timer

@Override

public void onDestroy() {

LogUtil.print("");

timer.cancel();

super.onDestroy();

}

/**

* 初始化

*/

private void init() {

timer = new Timer();

timer.schedule(new TimerTask() {

@Override......

October 29, 2016

SQLite使用备忘

1.表的操作:

创建表:

create table if not exists Student(id INTEGER PRIMARY KEY AUTOINCREMENT,name TEXT,age TEXT)

删除表:

drop table Student;

备份表:

create table Student_bak as select *from Student;

通过该方式创建的数据表将与SELECT查询返回的结果集具有相同的Schema信息,但是不包含缺省值和主键等约束信息。然而新创建的表将会包含结果集返回的所有数据。

2.表中数据的操作:

插入数据......