![](https://img-blog.csdnimg.cn/20201014180756928.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
Android
hexiaosa91
这个作者很懒,什么都没留下…
展开
-
Handler 原理
先上图 Handler sendMessage(msg) 会调用 sendMessageAtTime(msg, uptimeMillis), 在这里会调 enqueueMessage(queue, msg, uptimeMillis), 其中 queue 是 handler 的全局变量 mQueue, 在构造函数里,有这两行代码mLooper = Looper.myLooper();m...原创 2018-08-03 18:00:02 · 218 阅读 · 0 评论 -
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 · 345 阅读 · 0 评论 -
Android 图片处理
1. Bitmap 性能相关使用 inSampleSize 来缩放使用方式:BitmapFactory.Options options = new BitmapFactory.Options();options.inJustDecodeBounds = true; // 设为 true 不会分配内存,用来获取图片宽高BitmapFactory.decodeResource(...原创 2018-09-11 21:08:13 · 437 阅读 · 0 评论 -
Android 性能优化
本文将从布局优化、Bitmap、内存泄漏几个方面讲解 Android 性能优化。Android 中布局优化加载可能性小的布局使用 ViewStub, 在需要使用的时候再动态加载,因为 ViewStub 默认是 VISIBLE_GONE, 不去加载布局,在主动调用 inflate() 或 setVisible() 方法时才会渲染布局。尽可能减少布局的层级,比如一般情况下使用 Relative...原创 2018-09-26 14:46:19 · 296 阅读 · 0 评论 -
自定义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 · 388 阅读 · 0 评论 -
进程间通信 —— Binder 深入理解
简介在可以使用 AIDL 进行进程间通信后,AIDL 是基于 Binder 的,来通过 AIDL 分析一下 Binder。使用 AIDL 的过程中会有这样的疑问:Server onBind 方法返回的是一个 IMyInterface.Stub 对象,为什么客户端接收到的是 BinderProxy 对象呢首先对过程中出现的类进行解释IMyInterface : 自定义的 AIDL 接口,实...原创 2018-11-29 14:49:04 · 388 阅读 · 0 评论 -
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 阅读 · 0 评论 -
事件分发 ———— 从源码详细分析事件分发流程
从源码分析事件分发, https://blog.csdn.net/lmj623565791/article/details/39102591 这篇博客和 《Android开发艺术探索》 已经讲的很清晰了,我按从正常事件分发流程(返回结果都是 super),从源码角度分析事件分发的流程为什么是这样的。假设现在 DecoreView 里包含一个 ViewGourp(V1), ViewGroup 中包...原创 2019-01-31 17:23:30 · 559 阅读 · 0 评论 -
从源头分析 Android 中 View 的绘制流程
View 的绘制流程 layout,measure,draw,追溯到源头,就是 Activity 创建时 View 的绘制。从源码来看,大概会涉及到 Activity 的 attach, create, resume 这三个过程Activity 的 attach 过程启动 Activity 时,ActivityThread 的 performLaunchActivity 方法中先调用了 ac...原创 2019-04-09 18:02:36 · 151 阅读 · 0 评论 -
从 ListView 源码简单描述缓存复用流程
ListView 中缓使用了 RecycleBin(AbsListView 的内部类), 它内部有几个重要的成员变量: mScrapViews : 多种 viewType 时,缓存 viewType 个 view mCurrentScrap : 一种 viewType 时,缓存一个 view mActiveViews : 缓存屏幕上显示的 view, 用于在 layout 过程中复用 vie...原创 2018-08-29 23:58:57 · 120 阅读 · 0 评论 -
并发编程 —— ReentrantLock 原理
ReentrantReadWriteLock 是通过加锁来保证线程安全的,它是 Java 源码中内置的加锁的类ReentrantReadWriteLock lock = new ReentrantReadWriteLock();try { lock.writeLock().lock();} finally { lock.writeLock().unlock();}那么...原创 2018-08-21 22:17:35 · 145 阅读 · 0 评论 -
GreenDao 缓存
在项目中遇到这样的问题,数据库使用的 GreenDao, 两个 Activity, 分别添加同一个 Fragment, 查本地数据库,实体类中有一个是否选中状态的字段是不保存到数据库的,@transient 标记的,发现会出现这样的现象:在 Activity1 中的 Fragment 查出来,第一个位置选中,到 Activity2 中的 Fragment 查出来的第一个位置也是选中的,wha...原创 2018-08-03 18:04:51 · 531 阅读 · 0 评论 -
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 · 123 阅读 · 0 评论 -
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 · 235 阅读 · 0 评论 -
自定义 View ———— 折线图(重写 onDraw方法)
实现一个如下效果的折线图 这样的效果实现的方式很容易想到的就是重写 onDraw 方法,给定一组 float 值,分别画点、线,那么下面有颜色的阴影部分是用什么画呢,就用到了 Path, 一个点一个点相连成一个封闭的图形,便可画出这个图形。如果先画点,再画阴影部分,是会把点遮住一部分的,所以实现的时候先画完了阴影部分,再画线和点。不过这样子在 onDraw 方法里就有两个 for 循环,如果...原创 2018-08-16 01:14:52 · 433 阅读 · 0 评论 -
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 · 113 阅读 · 0 评论 -
从源码分析 setContentView 做了什么
从源码分析 Activity 的 onCreate 方法的 setContentView 都做了什么。public void setContentView(int layoutResID) { getWindow().setContentView(layoutResID); // 如果需要的话,初始化 ActionBar initWindowDecorActionBar...原创 2018-08-13 22:39:53 · 118 阅读 · 0 评论 -
AsyncTask 详解与思考
使用先上一段熟悉的代码,AsyncTask 的使用MyAsyncTask task = new MyAsyncTask();task.execute("1");private class MyAsyncTask extends AsyncTask<String, Void, String> { @Override protected void onPre...原创 2018-08-22 18:08:58 · 587 阅读 · 0 评论 -
RxJava 从源码分析流程
以下面这段代码为示例public void run(final ThreadListener<T> listener) { Observable.create(new ObservableOnSubscribe<T>() { @Override public void subscribe(ObservableEmitter<...原创 2018-08-21 22:15:22 · 158 阅读 · 0 评论 -
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 · 412 阅读 · 0 评论