自定义博客皮肤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 411

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

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

2019-04-09 18:02:36 149

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

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

2019-01-31 17:23:30 556

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

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

2019-01-09 18:36:33 179

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

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

2018-11-29 14:49:04 384

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

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

2018-11-18 21:36:56 312

原创 并发编程 —— CyclicBarrier 讲解

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

2018-10-27 11:13:44 166

原创 并发编程 —— 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 131

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

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

2018-10-27 11:11:50 384

原创 Android 性能优化

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

2018-09-26 14:46:19 295

原创 Android 图片处理

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

2018-09-11 21:08:13 436

原创 Java 类的加载

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

2018-09-05 23:16:10 93

原创 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 343

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

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

2018-08-29 23:58:57 118

原创 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 587

原创 并发编程 —— ReentrantLock 原理

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

2018-08-21 22:17:35 144

原创 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 154

原创 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 109

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

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

2018-08-16 01:14:52 429

原创 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 234

原创 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 119

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

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

2018-08-13 22:39:53 116

原创 JVM 垃圾回收

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

2018-08-13 22:33:13 110

原创 GreenDao 缓存

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

2018-08-03 18:04:51 528

原创 Handler 原理

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

2018-08-03 18:00:02 213

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

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

2018-08-03 17:52:42 120

空空如也

空空如也

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

TA关注的人

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