自定义博客皮肤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)
  • 收藏
  • 关注

原创 android Matrix的invert实现

invert的调用及实现​class SkMatrixGlue {public: static jboolean invert(jlong matrixHandle, jlong inverseHandle) { SkMatrix* matrix = reinterpre.

2022-04-12 22:58:22 2107

原创 AndroidStudio在windows上Build Output View 乱码

studio64.exe.vmoptions中添加-Dfile.encoding=UTF-8

2022-02-25 17:42:43 128

原创 ndk r17版本不再支持mips

编译报错 AndroidSdk/ndk-bundle/toolchains/mips64el-linux-android-4.9/prebuilt/linux-x86_64/bin/mips64el-linux-android-strip是因为r17版本不再支持mips找不到对应文件如果不需要编译对应架构 可以再build.gradle中配置 packagingOptions{ ...

2018-05-28 10:47:43 1929

原创 centOS命令行装androidSDK

linux中安装ndk与配置ndk环境变量:1、首先是官网找最新的linux下ndk安装包https://developer.android.google.cn/ndk/downloads/index.html 复制链接 wget下来2、unzip解压缩到{目标安装目录}3、这时候就需要配置环境变量了。环境变量的调用顺序一般为etc/profile->~/.bash_profile->...

2018-04-15 01:14:35 1146

原创 基于比较的排序时间下界

一个长度为n的集合排序的结果有n!个结果。以比较为基础的排序方式可以看做二叉树,每个非叶节点左右决定每次比较大小的走向,那么显然所有的排序结果都是在这个二叉树上的叶子(存在可能一结果多个叶子)。已知叶子节点数为不少于n!个,那么时间复杂度下界的求解就转化为,求解:一个已知叶子节点数不小于n!的二叉树的深度——即log(n!)当n>1时 有n!>= n(n-1)(n-2)...(n/2)...

2018-04-08 00:17:51 965

原创 BitmapFactory.Options的inDensity与drawable目录的关系

源码获取图片 在BitmapFactory.decodeResource时 options通常传入null那么在调用以下方法时 /** * Decode a new Bitmap from an InputStream. This InputStream was obtained from * resources, which we pass to be able to ...

2018-04-03 22:30:27 457

原创 Unsafe类的CAS

在FutureTask中使用到了大量Unsafe类的compareAndSwapObject方法在遇到线程安全问题时,我们通常需要使用锁来解决问题。而其中分为悲观锁与乐观锁,java中的synchronize关键字使用的就是悲观锁,它完全排除其他线程操作的可能,让其他有可能操作的线程挂起,独占资源直至操作结束,释放锁。 虽然保证了安全,但是效率极低。而CompareAndSwap则是一种乐观锁,它...

2018-04-03 22:29:51 572

原创 Android源码中的jni方法追踪

Android源码中的jni方法通常不是按照Java_路径名_方法名定义的,都是动态注册的,那么Android的JNI_Onload函数在哪里,我们又怎么去查询对应的函数实现呢?答案就在AndroidRuntime.cpp这里定义了动态加载的RegJNIRec结构体数组static const RegJNIRec gRegJNI[] = { REG_JNI(register_com_and...

2018-04-03 22:17:53 903

原创 linux的epoll实现

今天读到Looper的native实现 中间是依赖linux底层的epoll实现的,所以把今天了解到的相关知识做个整理。epoll是linux多路复用机制中select/poll的升级版。先谈谈select/poll代理即规避了单路阻塞式在多路并发时的线程/进程开销,又规避了忙轮询式 一直不停的问询所有流带来的损耗。只在有I/O事件更新的时候再遍历所有流。但这种机制还是有缺点,如果管道/流的数量很...

2018-04-03 22:08:59 281

原创 线程局部存储TLS

这里说的不是ssl里得安全传输协议。它的全名是Thread-Local Storage线程局部存储。又叫TSD:Thread-Specific Data线程特有数据池在C/C++程序中常存在全局变量、函数内定义的静态变量以及局部变量,对于局部变量来说,在栈里,其不存在线程安全问题。但是全局变量和函数内定义的静态变量就不同了。 我们可以用锁来处理(但效率太低);可以通过原子操作来实现(但不支持自定义...

2018-04-03 22:05:46 338

原创 MessageQueue.java源码分析

 前一篇文章Looper.java分析中已经提到mq实际上初始化nativeInit的是一个c的实例NativeMessageQueue,并将其指针reinterpret_cast<jlong>(nativeMessageQueue)保存在mPtr中@SuppressWarnings("unused") private long mPtr; // used by native ...

2018-04-02 20:14:35 571

原创 Looper.java分析

Looper作为Android中线程间通讯的核心,起着至关重要的作用。它与Handler,MessageQueue一起封装了一套完整的通讯机制。在调用Looper时,需要先执行prepare() 接着就可以loop()开始接收消息了。我们从来没有在应用的主线程中调用prepare()是因为在ActivityThread的main方法中public static void main(String[]...

2018-03-21 23:47:55 1573

原创 eventfd函数

eventfd是从LINUX 2.6.27版本开始增加的,主要用于进程或者线程间的通信(如通知/等待机制的实现)。实现了线程之间事件通知的方式,也可以用于用户态和内核通信。eventfd的缓冲区大小是sizeof(uint64_t);向其write可以递增这个计数器,read操作可以读取,并进行清零;eventfd也可以放到监听队列中,当计数器不是0时,有可读事件发生,可以进行读取。函数原型:#i...

2018-03-21 16:38:34 1044

原创 AsyncTask源码简析

(源码来自sdk7.0)构造方法构造方法有3个/** * Creates a new asynchronous task. This constructor must be invoked on the UI thread. */ public AsyncTask() { this((Looper) null); } /** ...

2018-02-23 01:46:43 266

原创 jdk8 HashMap源码分析

我们都知道 java的HashMap使用分离链接法实现static final int DEFAULT_INITIAL_CAPACITY = 1 static final int MAXIMUM_CAPACITY = 1 static final float DEFAULT_LOAD_FACTOR = 0.75f;  //默认装填因子static final int TRE

2018-01-23 11:32:33 272

原创 WebViewProvider的创建

private WebViewProvider mProvidermProvider作为WebView中一个重要的成员变量,几乎大部分WebView的方法实际实现是在这个对象里的。那么这个对象究竟是如何创建的呢?private void ensureProviderCreated() { checkThread(); if (mProvider == n

2017-11-21 10:53:50 3802 1

原创 RelativeLayout的onMeasure源码分析

都知道RelativeLayout的一次测量调用两次子视图测量循环横向一次 纵向一次带着目的, 我们来分析源码 @Override protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { if (mDirtyHierarchy) { mDirty

2017-07-22 02:42:57 1124 2

原创 AppCompatActivity的魔术——如何做到适配新控件

大家都知道google要求使用app的模板类继承AppCompatActivity这是一个继承FragmentAcvitivy的类,他是怎么做到让过时控件去使用酷炫的新特性的呢?来看源码核心变量 private AppCompatDelegate mDelegate;这是兼容的老套路,便于在版本迭代的时候统一维护升级与兼容 /** * @return The {

2017-07-11 17:28:17 2263

原创 Android手势 怎么样才算长按(GestureDetector源码)

GestureDetector里onLongPress方法的回调来自 private void dispatchLongPress() { mHandler.removeMessages(TAP); mDeferConfirmSingleTap = false; mInLongPress = true; mListener.

2017-07-05 15:58:30 1029

原创 ItemTouchHelper实现部分响应拖动

/**     * Starts dragging the provided ViewHolder. By default, ItemTouchHelper starts a drag when a     * View is long pressed. You can disable that behavior by overriding     * {@link ItemTouch

2017-07-04 23:23:17 2215 1

原创 源码分析 ItemTouchHelper手势的入口 (OnInterceptTouchEvent onLongPress等)

ItemTouchHelper手势的实现都在匿名内部类mOnItemTouchListener中实现,private final OnItemTouchListener mOnItemTouchListener = new OnItemTouchListener()与RecyclerView的绑定,则在attachToRecyclerView方法中的setu

2017-07-04 19:53:18 911 1

原创 ItemTouchHelper源码分析 手势分析OnTouchEvent

ItemTouchHelper手势的实现都在匿名内部类mOnItemTouchListener中实现,private final OnItemTouchListener mOnItemTouchListener = new OnItemTouchListener()与RecyclerView的绑定,则在attachToRecyclerView方法中的setupCal

2017-07-04 00:21:21 1238

原创 ItemTouchHelper源码分析 拖拽到屏幕边缘的处理

如果列表被拖拉到屏幕边缘 该runnable会被递归调用  /** * When user drags a view to the edge, we start scrolling the LayoutManager as long as View * is partially out of bounds. */ final Runnable mSc

2017-07-03 20:17:04 1948 3

原创 BaseAdapter的stableIds用处

用了ListView一万年,久仰public boolean hasStableIds() { return false; }方法大名九千年,就是一直不知道这属性到底有什么用。今天就来彻底弄清楚!stackoverflow.com上有一篇issue相关:what-is-the-meaning-of-stableidsStable ID

2017-07-02 16:55:33 907

原创 RecyclerView回收机制分析--“取”

RecyclerView的回收被封装在内部类Recycler中 从这个类的成员变量就能略窥一斑 /** * A Recycler is responsible for managing scrapped or detached item views for reuse. * * A "scrapped" view is a view that is stil

2017-07-01 17:48:18 3495

原创 AbsListView的重用机制——“存”方法分析

AbsListView的缓存行为主要由内部类RecycleBin的addScrapView方法实现这是一个缺省修饰的方法 用于回收指定position的itemView(scrap)/**         * Puts a view into the list of scrap views.         *          * If the list data hasn'

2017-07-01 16:38:35 638

空空如也

空空如也

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

TA关注的人

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