自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(26)
  • 收藏
  • 关注

原创 Retrofit(OkHttp)源码分享

Retrofit(OkHttp)源码分享 一、使用 1.创建接口 public interface CountTryApi { @GET("/api/location/country") Call<ResponseBody> getCall(@Query("id") String id); } 2.发起请求 Retrofit retrofit = new Retro...

2019-08-09 20:28:29 507

原创 从源头分析 Android 中 View 的绘制流程

View 的绘制流程 layout,measure,draw,追溯到源头,就是 Activity 创建时 View 的绘制。 从源码来看,大概会涉及到 Activity 的 attach, create, resume 这三个过程 Activity 的 attach 过程 启动 Activity 时,ActivityThread 的 performLaunchActivity 方法中先调用了 ac...

2019-04-09 18:02:36 231

原创 事件分发 ———— 从源码详细分析事件分发流程

从源码分析事件分发, https://blog.youkuaiyun.com/lmj623565791/article/details/39102591 这篇博客和 《Android开发艺术探索》 已经讲的很清晰了,我按从正常事件分发流程(返回结果都是 super),从源码角度分析事件分发的流程为什么是这样的。 假设现在 DecoreView 里包含一个 ViewGourp(V1), ViewGroup 中包...

2019-01-31 17:23:30 674

原创 View 坐标体系和 View 的滑动

View 坐标介绍 View 坐标表示有以下几种, getLeft, getTranstationX, getScrollX, getRawX, getX. 那么这几种表示有什么区别呢 getLeft 表示 View 的实际坐标,View 的实际左上角距离父 View 左上角的水平距离。 getTranslationX 表示 View 与父 View 的水平偏移量,可以通过设置 view.se...

2019-01-09 18:36:33 258

原创 进程间通信 —— Binder 深入理解

简介 在可以使用 AIDL 进行进程间通信后,AIDL 是基于 Binder 的,来通过 AIDL 分析一下 Binder。 使用 AIDL 的过程中会有这样的疑问: Server onBind 方法返回的是一个 IMyInterface.Stub 对象,为什么客户端接收到的是 BinderProxy 对象呢 首先对过程中出现的类进行解释 IMyInterface : 自定义的 AIDL 接口,实...

2018-11-29 14:49:04 518

原创 并发编程 —— 线程池简介和源码分析

线程池简介 线程池的优点:提高性能,提高线程的利用率,可控制线程的最大并发数,方便线程管理。 线程池的核心类是 ThreadPoolExecutor, 可通过 Executors 中的几个方法创建线程池,分别是: CachedThreadPool 核心线程数为 0, 线程数量无上限 FixedThreadPool 核心线程数由使用者自己指定,无非核心线程,线程空闲时不会被回收,除非线程池被...

2018-11-18 21:36:56 390

原创 并发编程 —— CyclicBarrier 讲解

CyclicBarrier 介绍 CyclicBarrier 是用于阻塞固定数量的线程,数量达到时就继续这些线程的执行,并可以指定继续执行这些线程之前执行 Runnable, 这个 Runnable 是在到达临界数量的那个线程执行的。 例子如下: private static CyclicBarrier caBarrier = new CyclicBarrier(3, new Runnable()...

2018-10-27 11:13:44 237

原创 并发编程 —— CountDownLatch 讲解

CountDownLatch 介绍 CountDownLatch 是用于等待线程的执行,等待线程数量为 0 后,则结束等待,执行该线程等待后所要执行的代码。 例子如下: private static CountDownLatch caDownLatch = new CountDownLatch(2); public static void main(String[] args) { new T...

2018-10-27 11:12:56 188

原创 自定义View —— 可删除 item 的 ListView (事件分发)

本文所用源码:https://github.com/HeXiaosa/ItemDeletableListView 本文由看这篇文章 https://blog.youkuaiyun.com/lmj623565791/article/details/22961279 以及结合 Andorid 开发艺术探索而来。 事件分发概述 Android 中触摸事件主要由 dispatchTouchEvent, onInt...

2018-10-27 11:11:50 477

原创 Android 性能优化

本文将从布局优化、Bitmap、内存泄漏几个方面讲解 Android 性能优化。 Android 中布局优化 加载可能性小的布局使用 ViewStub, 在需要使用的时候再动态加载,因为 ViewStub 默认是 VISIBLE_GONE, 不去加载布局,在主动调用 inflate() 或 setVisible() 方法时才会渲染布局。 尽可能减少布局的层级,比如一般情况下使用 Relative...

2018-09-26 14:46:19 383

原创 Android 图片处理

1. Bitmap 性能相关 使用 inSampleSize 来缩放 使用方式: BitmapFactory.Options options = new BitmapFactory.Options(); options.inJustDecodeBounds = true; // 设为 true 不会分配内存,用来获取图片宽高 BitmapFactory.decodeResource(...

2018-09-11 21:08:13 548

原创 Java 类的加载

类的加载过程 加载 将 .java 文件转成二进制流 将类信息存入方法区 在方法区中生成一个 Class 对象,用于访问该类的接口 PS: 读取到二进制流的来源,常见的有:ZAR包,运行中动态计算(动态代理),其它文件生成(JSP) 验证 验证过程是为了防止恶意代码破坏虚拟机而进行验证的过程。 1. 文件格式验证:该过程是针对二进制流进行的,只有通过了该验证,二进制流才可以进...

2018-09-05 23:16:10 142

原创 RecycleView 缓存机制

RecyclerView 的使用: RecyclerView lv = (RecyclerView) findViewById(R.id.lv); lv.setLayoutManager(new LinearLayoutManager(getApplicationContext(), LinearLayoutManager.VERTICAL, false)); lv.setAdapter(new...

2018-09-01 23:13:10 441

原创 从 ListView 源码简单描述缓存复用流程

ListView 中缓使用了 RecycleBin(AbsListView 的内部类), 它内部有几个重要的成员变量: mScrapViews : 多种 viewType 时,缓存 viewType 个 view mCurrentScrap : 一种 viewType 时,缓存一个 view mActiveViews : 缓存屏幕上显示的 view, 用于在 layout 过程中复用 vie...

2018-08-29 23:58:57 168

原创 AsyncTask 详解与思考

使用 先上一段熟悉的代码,AsyncTask 的使用 MyAsyncTask task = new MyAsyncTask(); task.execute(&quot;1&quot;); private class MyAsyncTask extends AsyncTask&amp;lt;String, Void, String&amp;gt; { @Override protected void onPre...

2018-08-22 18:08:58 680

原创 并发编程 —— ReentrantLock 原理

ReentrantReadWriteLock 是通过加锁来保证线程安全的,它是 Java 源码中内置的加锁的类 ReentrantReadWriteLock lock = new ReentrantReadWriteLock(); try { lock.writeLock().lock(); } finally { lock.writeLock().unlock(); } 那么...

2018-08-21 22:17:35 198

原创 RxJava 从源码分析流程

以下面这段代码为示例 public void run(final ThreadListener&lt;T&gt; listener) { Observable.create(new ObservableOnSubscribe&lt;T&gt;() { @Override public void subscribe(ObservableEmitter&lt;...

2018-08-21 22:15:22 223

原创 Retrofit 源码分析

Retrofit 使用例子 下面只展示了异步请求示例 Retrofit retrofit = new Retrofit.Builder() .baseUrl("https://api.github.com") .build(); GitHubService service = retrofit.create(GitHubService.class); se...

2018-08-16 01:17:57 170

原创 自定义 View ———— 折线图(重写 onDraw方法)

实现一个如下效果的折线图 这样的效果实现的方式很容易想到的就是重写 onDraw 方法,给定一组 float 值,分别画点、线,那么下面有颜色的阴影部分是用什么画呢,就用到了 Path, 一个点一个点相连成一个封闭的图形,便可画出这个图形。如果先画点,再画阴影部分,是会把点遮住一部分的,所以实现的时候先画完了阴影部分,再画线和点。不过这样子在 onDraw 方法里就有两个 for 循环,如果...

2018-08-16 01:14:52 545

原创 Toast 源码分析

思考 在分析源码之前有两个问题 子线程直接使用 Toast 时会抛出异常 “Can’t create handler inside thread that has not called Looper.prepare()”, 在 Toast 类里搜 “Looper” 并搜不到。是哪里抛出的这个异常呢? 在子线程中这样使用 Toast: Looper.prepare(); Toast.m...

2018-08-14 21:37:42 331

原创 OkHttp 源码分析

OkHttp 使用代码实例 private static final MediaType JSON = MediaType.parse("application/json; charset=utf-8"); OkHttpClient client = new OkHttpClient(); String post(String url, String json) throw...

2018-08-14 21:35:41 192

原创 从源码分析 setContentView 做了什么

从源码分析 Activity 的 onCreate 方法的 setContentView 都做了什么。 public void setContentView(int layoutResID) { getWindow().setContentView(layoutResID); // 如果需要的话,初始化 ActionBar initWindowDecorActionBar...

2018-08-13 22:39:53 184

原创 JVM 垃圾回收

Java 内存模型 Java 内存模型分为 5 个部分,程序计数器,虚拟机栈,本地方法栈,堆,方法区 程序计数器:线程私有,每个线程都有自己的程序计数器,指向正在执行的字节码地址。这个内存区也是 Java 内存模型中唯一一个不会发生内存溢出的区域。 虚拟机栈:线程私有,方法的执行都会涉及到虚拟机栈的入栈出栈操作。包含局部变量表、操作数栈、动态连接栈,局部变量表保存方法参数和方法内部变量,对于...

2018-08-13 22:33:13 191

原创 GreenDao 缓存

在项目中遇到这样的问题,数据库使用的 GreenDao, 两个 Activity, 分别添加同一个 Fragment, 查本地数据库,实体类中有一个是否选中状态的字段是不保存到数据库的,@transient 标记的,发现会出现这样的现象:在 Activity1 中的 Fragment 查出来,第一个位置选中,到 Activity2 中的 Fragment 查出来的第一个位置也是选中的,wha...

2018-08-03 18:04:51 641

原创 Handler 原理

先上图 Handler sendMessage(msg) 会调用 sendMessageAtTime(msg, uptimeMillis), 在这里会调 enqueueMessage(queue, msg, uptimeMillis), 其中 queue 是 handler 的全局变量 mQueue, 在构造函数里,有这两行代码 mLooper = Looper.myLooper(); m...

2018-08-03 18:00:02 308

原创 并发编程 —— Java 线程安全相关

线程不安全的原因 正是有了多线程,才会出现线程不安全。线程不安全的原因就是多个线程某段代码不具备原子性、可见性或有序性导致的。 原子性是指一个操作是不可被其它线程打断的,加锁就是保证了原子性。 可见性是一个线程修改了某个共享值,其它线程能立即可知,不会出现一个线程修改了某个值,另一个线程读到旧值的情况。使用 volatile 就可以保证可见性。 有序性是由于编译器会进行指令重排序,当不同线程...

2018-08-03 17:52:42 197

空空如也

空空如也

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

TA关注的人

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