- 博客(26)
- 收藏
- 关注
原创 android Matrix的invert实现
invert的调用及实现class SkMatrixGlue {public: static jboolean invert(jlong matrixHandle, jlong inverseHandle) { SkMatrix* matrix = reinterpre.
2022-04-12 22:58:22 2186
原创 AndroidStudio在windows上Build Output View 乱码
studio64.exe.vmoptions中添加-Dfile.encoding=UTF-8
2022-02-25 17:42:43 182
原创 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 1977
原创 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 1238
原创 基于比较的排序时间下界
一个长度为n的集合排序的结果有n!个结果。以比较为基础的排序方式可以看做二叉树,每个非叶节点左右决定每次比较大小的走向,那么显然所有的排序结果都是在这个二叉树上的叶子(存在可能一结果多个叶子)。已知叶子节点数为不少于n!个,那么时间复杂度下界的求解就转化为,求解:一个已知叶子节点数不小于n!的二叉树的深度——即log(n!)当n>1时 有n!>= n(n-1)(n-2)...(n/2)...
2018-04-08 00:17:51 1071
原创 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 508
原创 Unsafe类的CAS
在FutureTask中使用到了大量Unsafe类的compareAndSwapObject方法在遇到线程安全问题时,我们通常需要使用锁来解决问题。而其中分为悲观锁与乐观锁,java中的synchronize关键字使用的就是悲观锁,它完全排除其他线程操作的可能,让其他有可能操作的线程挂起,独占资源直至操作结束,释放锁。 虽然保证了安全,但是效率极低。而CompareAndSwap则是一种乐观锁,它...
2018-04-03 22:29:51 631
原创 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 951
原创 linux的epoll实现
今天读到Looper的native实现 中间是依赖linux底层的epoll实现的,所以把今天了解到的相关知识做个整理。epoll是linux多路复用机制中select/poll的升级版。先谈谈select/poll代理即规避了单路阻塞式在多路并发时的线程/进程开销,又规避了忙轮询式 一直不停的问询所有流带来的损耗。只在有I/O事件更新的时候再遍历所有流。但这种机制还是有缺点,如果管道/流的数量很...
2018-04-03 22:08:59 326
原创 线程局部存储TLS
这里说的不是ssl里得安全传输协议。它的全名是Thread-Local Storage线程局部存储。又叫TSD:Thread-Specific Data线程特有数据池在C/C++程序中常存在全局变量、函数内定义的静态变量以及局部变量,对于局部变量来说,在栈里,其不存在线程安全问题。但是全局变量和函数内定义的静态变量就不同了。 我们可以用锁来处理(但效率太低);可以通过原子操作来实现(但不支持自定义...
2018-04-03 22:05:46 413
原创 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 637
原创 Looper.java分析
Looper作为Android中线程间通讯的核心,起着至关重要的作用。它与Handler,MessageQueue一起封装了一套完整的通讯机制。在调用Looper时,需要先执行prepare() 接着就可以loop()开始接收消息了。我们从来没有在应用的主线程中调用prepare()是因为在ActivityThread的main方法中public static void main(String[]...
2018-03-21 23:47:55 1655
原创 eventfd函数
eventfd是从LINUX 2.6.27版本开始增加的,主要用于进程或者线程间的通信(如通知/等待机制的实现)。实现了线程之间事件通知的方式,也可以用于用户态和内核通信。eventfd的缓冲区大小是sizeof(uint64_t);向其write可以递增这个计数器,read操作可以读取,并进行清零;eventfd也可以放到监听队列中,当计数器不是0时,有可读事件发生,可以进行读取。函数原型:#i...
2018-03-21 16:38:34 1133
原创 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 296
原创 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 307
原创 WebViewProvider的创建
private WebViewProvider mProvidermProvider作为WebView中一个重要的成员变量,几乎大部分WebView的方法实际实现是在这个对象里的。那么这个对象究竟是如何创建的呢?private void ensureProviderCreated() { checkThread(); if (mProvider == n
2017-11-21 10:53:50 4044 1
原创 RelativeLayout的onMeasure源码分析
都知道RelativeLayout的一次测量调用两次子视图测量循环横向一次 纵向一次带着目的, 我们来分析源码 @Override protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { if (mDirtyHierarchy) { mDirty
2017-07-22 02:42:57 1222 2
原创 AppCompatActivity的魔术——如何做到适配新控件
大家都知道google要求使用app的模板类继承AppCompatActivity这是一个继承FragmentAcvitivy的类,他是怎么做到让过时控件去使用酷炫的新特性的呢?来看源码核心变量 private AppCompatDelegate mDelegate;这是兼容的老套路,便于在版本迭代的时候统一维护升级与兼容 /** * @return The {
2017-07-11 17:28:17 2315
原创 Android手势 怎么样才算长按(GestureDetector源码)
GestureDetector里onLongPress方法的回调来自 private void dispatchLongPress() { mHandler.removeMessages(TAP); mDeferConfirmSingleTap = false; mInLongPress = true; mListener.
2017-07-05 15:58:30 1084
原创 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 2317 1
原创 源码分析 ItemTouchHelper手势的入口 (OnInterceptTouchEvent onLongPress等)
ItemTouchHelper手势的实现都在匿名内部类mOnItemTouchListener中实现,private final OnItemTouchListener mOnItemTouchListener = new OnItemTouchListener()与RecyclerView的绑定,则在attachToRecyclerView方法中的setu
2017-07-04 19:53:18 1061 1
原创 ItemTouchHelper源码分析 手势分析OnTouchEvent
ItemTouchHelper手势的实现都在匿名内部类mOnItemTouchListener中实现,private final OnItemTouchListener mOnItemTouchListener = new OnItemTouchListener()与RecyclerView的绑定,则在attachToRecyclerView方法中的setupCal
2017-07-04 00:21:21 1295
原创 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 2090 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 996
原创 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 3554
原创 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 681
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人