November 04, 2016

TextView行数监听器

其实代码很简单,只是一个简单的封装而已,方便自己以后遇到类似的问题可以快速复用。看一个程序员溜不溜,我觉得主要看两点:一是他踩的坑多不多,二是他积累的轮子多不多。以后,我要努力积累更多的小轮子。

1.业务需求:

TextView单行时右对齐,多行左对齐

2.TextView行数监听器

其实就是简单的对addOnPreDrawListener和removeOnPreDrawListener做了一下封装而已

/**

* 监听TextView的行数变化

* ......

October 31, 2016

自定义ORM框架

一、ORM简单科普

所谓ORM,即对象-关系映射(Object/Relation Mapping),方便我们以操作对象的方式去操作关系型数据库。

在平时的开发过程中,大家一定会或多或少地接触到SQLite。然而在使用它时,我们往往需要做许多额外的工作,像编写 SQL 语句与解析查询结果等。

假如我们有这样一个对象需要存在数据库:

@Table

public class Person {

@Column

private int id;

@Check("name!='Fucker'")

@Column

private String name;

......

October 31, 2016

Json转Map

数据源:

{

"多媒体系统": "单碟CD",

"进气形式": "自然吸气"

}

代码:

package com.che.carcheck.ui.test;

import com.alibaba.fastjson.JSON;

import java.util.Map;

import java.util.Set;

/**

* Json转Map

*

* 作者:余天然 on 16/5/12 下午8:27

*/

public class Test_Json {

public static void main(String[] args) {

St......

October 29, 2016

网络状态工具类

“Talk is cheap. Show me the code.”

能用代码解决的事,就不要说废话。

public class NetUtil {

/*获取网络连接状态*/

public static NetState getNetState() {

NetState stateCode = NetState.NET_NO;

ConnectivityManager cm = (ConnectivityManager) BaseApplication.getInstance().getSystemService(Context.CONNEC......

October 29, 2016

Log日志工具类

使用说明

使用超简单:

private void testLog() {

LogUtil.print("");

LogUtil.print("你好");

LogUtil.print("net", "baidu.com");

LogUtil.print(Log.VERBOSE, "你好啊");

LogUtil.print(Log.DEBUG, "你好啊");

LogUtil.print(Log.INFO, "你好啊");

LogUtil.print(Log.WARN, ......

October 29, 2016

OkHttp自定义重试次数

本文主要应用了OkHttp的Interceptor来实现自定义重试次数,不熟悉Interceptor的朋友可以先看我的另外一篇博文:Okhttp基本用法和流程分析

虽然OkHttp自带retryOnConnectionFailure(true)方法可以实现重试,但是不支持自定义重试次数,所以有时并不能满足我们的需求。

1.自定义重试拦截器:

/**

* 重试拦截器

*/

public class RetryIntercepter implements Interceptor {

public int maxRetry;//最大重试次数

private int re......

October 29, 2016

第三方分享工具类

以前都是直接集成的友盟的,但后来觉得友盟的分享,有时候要自定义那个分享弹窗有一点麻烦,所以就放弃了。这里,因为业务需要,我只集成了微信,不过QQ、微博其实也差不多,大家可以自行添加。

分享弹窗

1.自定义分享弹窗

/**

* 分享弹窗

* <p>

* 作者:余天然 on 16/8......

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

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.表中数据的操作:

插入数据......

October 29, 2016

Android-面向Holder编程

相信大家在Android编程中,应该会有一种体验:一个Activity要执行的功能太多了,导致代码有时甚至上千行,极其不方便阅读和修改,这里,面向Holder编程,就是解决这个问题的一个绝佳方案。

所谓面向Holder编程,其实很简单,就是把一个大的复杂的功能或者页面分成几个小的功能分别去实现,下面我们看一张图片来说明面向Holder编程思想:

October 29, 2016

Android Stuidio与Eclipse项目源码之间的互转

这里以es转as为例:

(不推荐使用官方的import--》.gradle的方法,此法转到as,工作区和项目不分,极容易出问题)

我们老实一点,使用笨方法,一个个的拷贝es的文件到as相应的目录下。

1、首先,我们认识一下ES和AS的目录结构的区别:

【图1】

2、ES--->AS的文件夹对应关系:

【图2】

汗,之后才发......

October 29, 2016

基于 Volley搭建的网络请求框架和图片加载框架

1、导入volley.jar、DiskLruCache.java

2、在自定义Application中配置volley

package com.example.chechengwang.global;

import com.android.volley.RequestQueue;

import com.android.volley.toolbox.ImageLoader;

import com.android.volley.toolbox.Volley;

import com.example.chechengwang.R;

import com.example.chechengwang.u......

October 29, 2016

ListView的每个Item的飞入动画

1、在ListView设置LayoutAnimation

list_car = (ListView) findViewById(R.id.list_car);

adapter = new CollectCarAdapter(this);

list_car.setAdapter(adapter);

list_car.setLayoutAnimation(getListAnim());

/**

* ListView的飞入动画

* @return

*/

private LayoutAnimationContro......

October 29, 2016

webview加载html文件

WebView mywebview;

@SuppressLint("JavascriptInterface")

private void initWebView() {

mywebview = (WebView) findViewById(R.id.webview);

WebSettings settings = mywebview.getSettings();

settings.setJavaScriptEnabled(true);

settings.setUseWideViewPort(true);

......