自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

Ethan的博客

小白向大牛逆袭之路

  • 博客(24)
  • 问答 (1)
  • 收藏
  • 关注

原创 Android鲜为人知的TouchDelegate

我们都知道Android触屏事件是在视图树中传递的,ViewGroup决定是否拦截触屏事件,如果拦截就自己处理触屏事件,如果不拦截就传递给子视图,子视图如果是ViewGroup会经历同样的逻辑,子视图如果是View(这里特指不能包含子视图的View)就只能在自己的onTouch或者onTouchEvent中处理,并返回true或者false来告知父视图处理完没有。子View处理过程中有onTou...

2019-06-21 22:52:04 3331 1

原创 Android为什么不建议写死dp?

基础:Android中很熟悉的一个概念:dp (density-independent pixels),一个dp代表多少实际像素与设备dpi相关,与px(像素)换算关系:dp/160 = px/dpi。由换算关系得到px = (dp * dpi)/160, 看上去意思是相同dp情况下,dpi越大,px值越大,即设备像素密度越高,1个dp代表的实际像素也越多。同理,dpi越小,相同dp时,px值也...

2019-06-01 10:59:11 1644

原创 java模板模式与AQS实现

本博客先简单看下模板模式,然后解析下java中的AQS是如何使用模板模式的,最后使用AQS自定义一种锁。模板模式顾名思义,本模式旨在"套模板",跟写PPT时套模板道理一样,PPT模板事先给好布局、图片、配色等,用户添加自己的内容即可。模板模式则是父类事先准备好一些函数框架,子类(用户类)继承父类并实现自己的功能即可。UML图如下:父类为虚类,其中execute方法伪代码如下:privat...

2019-05-23 22:36:59 1554

原创 synchronized关键字修饰静态方法与成员方法的区别

开发中常用的加锁方式就是使用synchronized关键字,可以在以下三种情景使用:修饰static方法修饰成员方法修饰代码块synchronized本质是一种独占锁,即某一时刻仅能有一个线程进入临界区,其他线程必须等待,处于block状态。下面以几个例子分别看下不同场景下的synchronized修饰static方法public class SyncArea { publ...

2019-05-22 16:05:21 4021

原创 Java单例模式的演进

在Android开发中,单例还是很有用的,一般在上层业务逻辑开发中使用,笔者不推荐在偏底层且跟业务相关的SDK中使用单例,比如网络连接、图片加载,这是因为大型APP会分出许多模块、频道,一旦底层SDK使用单例,上层所有业务都是使用同一个实例,各个模块很难进行个性化使用。下面来看典型的几种单例实现方式。1.非线程安全的方式//非线程安全public class TestSingle ...

2019-05-17 17:24:04 141

原创 MIPS汇编角度看C语言的指针

如下MIPS程序,新建一个数组,然后依次删除数组内容 .data .globl main .textmain: #mock data start li $a0, 268435456 #(1000 0000)16 静态数据区起始位置 li $t1, 618 sw $t1, 0($a0) addi $t1, $t1, 10 sw $t1, 4($a0) addi $t1, $...

2019-04-07 20:02:33 1344

原创 [长期记录]开发中的小知识点

注:本篇小知识点都是在实际项目中运用过的,比较可靠20170606解压tar包指令tar –xvf file.tar //解压 tar包判断图片格式通过后缀名判断图片是什么格式其实并不准确,可以使用BitmapFactory的方法去判断:String path = "图片路径";BitmapFactory.Options options = new BitmapFactory.Options();

2017-06-06 21:01:29 401

原创 RxJava+Retrofit实践

本篇文章会沿用MVP的思路,MVP模式可以看下之前的这篇文章: http://blog.csdn.net/ethanhola/article/details/54589746 retrofit是对okhttp的又一层封装,从使用上来说可以使用okhttp的所有特性,也可以定制httpclient。 本文的网络请求来自gank.io, 要实现的功能就是使用rxjava处理网络请求的构造以及成功失

2017-04-22 17:18:54 655

原创 使用rxjava实现点击防抖动

开发中经常遇到这种点击按钮会响应两次的情况,原因就是点击一次没反应又点击了一次,包括微信的发现页、朋友圈点击都是这样,连续点两次就弹出两次页面,这不是什么大问题,但是对于点击之后立马要处理逻辑的事件就可能有问题。还是解决一下传统解决方法获取系统时间,第一次可以点击,后续要加上时间间隔判断,大于设定的时间间隔再执行点击,很简洁。public abstract class OnMultiClickLis

2017-04-21 14:45:43 8909

原创 Android获取上下文几个方法的区别

先看下继承关系,Activity/Service/Application都是继承自Context的,获取上下文实际获取的是各子类的上下文实例,可能是Activity,也可能是Application等,具体使用哪一个,需要根据当前控件选择,不能随意使用。 1.getContext这是View的一个方法,获取视图上下文,view一般是依托于Activity,所以这个方法返回的是当前Activity实例

2017-02-13 11:46:12 3786

原创 Service Intent must be explicit的两种解决方法

crash的原因是5.0以上service不能使用隐式intent启动,但是使用AIDL进行进程间通信时并不能得到具体的类名,so, 问题还得解决。方法一最简单的是新建Intent的时候带入packagename,直接调用setPackage方法,把service所在的包名设置进intent。 Intent intent = new Intent(); intent.s

2017-02-03 18:20:55 1987

原创 Fragment事务与回退栈

一句话总结,回退栈管理的是事务(Transaction),栈里的数据结构是事务,不是fragment本身。FragmentManager manager = getSupportFragmentManager();(这是v4包的,app也有相关方法)FragmentTransaction transaction = manager.beginTransaction();FragmentManage

2017-01-20 22:05:55 729

原创 使用gradle区分开发环境

场景:公司服务器与app都会有test、beta、online等环境区分,这些可以在代码里手动修改,然后重新build新的apk文件,而且一个手机上只能装一个app,如果切换环境需要覆盖安装。本博客主要是使用build.gradle文件动态修改开发环境配置,核心是使用BuildConfig这个编译过程生的文件。buildTypegradle中可以指定编译类型,在build.gradle中可以配置bu

2017-01-19 14:54:33 2237

原创 海外社交平台(Facebook Twitter WhatsApp)的分享

海外的社交平台没有像Mob一样的集成sdk,各有各的sdk,掉进几次坑里,在此记录一下。三个平台都可以同时分享图片、链接、文字、Facebookfacebook分享的图片需是来自网络的图片url,sdk注释:/*** Set the URL of a picture to attach to this content.* @param imageUrl The network URL of an

2017-01-18 00:17:38 10317

原创 MVP模式在实际开发中的使用

业务逻辑写的越来越多,越来越复杂,将业务逻辑都放到Activity中写当时可能觉得很爽,因为写的随意,写的速度也快,但是后期维护很困难,交接项目的成本也很高。MVP模式应运而生。MVP原理M指代model,用于存放数据的模型,用于Json解析、缓存等。 V指代View,通常意义上的Android视图,由于静态的view功能太少,需要Activity控制,这里将Activity视为View,进行视图

2017-01-18 00:12:21 892

原创 Android js和native交互的两种方法

本博客解决的问题是Android本地方法和webview中js方法交互,方法一是使用的是Android自身js注解,方法二是开源库jockeyjs。方法一:js注解先上js脚本(代码来自网络):<html><head><meta http-equiv="Content-Type" content="text/html;charset=gb2312"><script type="text/

2016-07-08 18:59:51 4987

原创 Android图片适配的来龙去脉

本篇博客只记述图片的适配,尺寸的适配是在dimens文件中加的,与本篇无关。为什么要做图片的适配?一张图片有它的分辨率,比如32x32,就是32个像素x32个像素,不同手机的分辨率不同,而我们想让这些图片在不同分辨率的Android设备上显示它原有的像素,这就是原因。先来看几个变量: (1)分辨率(resolution):常说的手机1080 x 1920的值就是分辨率。(2)像素密度(dpi):d

2016-04-18 19:02:26 516

原创 Android测试框架之Robolectric

要开始一个新项目了,奈何测试部门人不够了,只能自己写测试了。。Robolectric是封装了junit4的测试框架,我对测试不怎么了解,只有大学上的软件测试课的基础,只知道什么是白盒测试,黑盒测试,集成测试,Robolectric属于黑盒测试。配置Robolectric环境:mac+Android studio+sdk level23 (1)app下的build.gradle: dependen

2016-03-31 19:38:35 1794

原创 Lazy inflate之ViewStub

很多时候我们想要的功能是,一个view在需要它的时候让它显示,不需要它的时候不希望它显示,最常见的思路是设置view的visible属性,gone、invisible或者visible,但这个做法有个缺陷,就是无论设置哪个属性,这个layout文件都会被解析,做了很多无用功。ViewStub就是为了解决这个问题的。ViewStub继承自View,复写了View的onMeasure方法: @Ov

2016-03-29 19:52:50 388

原创 Android依赖注入库Dagger的使用

关于依赖注入(Dependency Injection,简称DI)类和类之间要建立联系,比如A类需要B类的实例对象,我们就说A类依赖B类,反过来,就说B类注入到A类中,所以“依赖注入”表示两层含义,依赖和注入。View层面的DI看了两个DI的库,AndroidAnnotation和Butter knife,个人感觉后者更好用一些,不会生成多余的类文件,都是view层面的DI,使用比较简单自定义的DI

2016-03-15 19:32:29 540

原创 DialogFragment与Activity通信最佳实践

这篇博客与上篇http://blog.csdn.net/ethanhola/article/details/50888410组成一个Surfaceview中自由手绘的demo,源码地址:https://github.com/boomstack/MySurfaceView 欢迎follow and fork! Google推荐使用DialogFragment创建对话框,因为Android系统设计的

2016-03-14 19:03:57 964

原创 Android SurfaceView双缓冲绘图

这篇文章与下一篇关于DialogFragment与Activity通信的博客共同组成了一个Demo,即使用SurfaceView实现自由手绘,功能包括颜色选择、画笔粗细、撤销重做、橡皮擦。源码托管在github,欢迎follow and fork! 源码地址:https://github.com/boomstack/MySurfaceView 双缓冲其实解决的问题是不加缓冲时的闪烁、卡顿问题,不

2016-03-14 17:43:04 3171

原创 Android Event分发机制

Android event dispatch mechanism总的来说,Android的事件分发都是针对View的,但是要知道,直接继承自View的类分为两类,一类是诸如TextView、SurfaceView的“单一”View,说是单一是因为这些view不可以嵌套其他view,另一类就是ViewGroup,可以嵌套其他的view,常用的Linearlayout、Framelayout、Adapt

2016-03-09 16:23:56 415

原创 Java基本类型转换的优先顺序

Java中经常碰到两个不同类型的基本类型数据进行运算,当没有强制类型转化时,它们之间总会有一个标准去衡量最终的计算结果是什么类型的吧,下面以一个简单的例子看看默认的优先顺序:public class Main { public static void main(String[] args) { byte by = 2; short sh = 4;

2016-03-07 23:52:34 2019

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除