前段时间在研究插件化,其中主要看了任玉刚动态加载框架——dynamic-load-apk,其Activity的注册问题主要是通过静态代理的方式来完成,之前了解过代理模式,但具体没使用过,这次看到了具体的使用,于是更深入的去学习静态代理,以及动态代理。

本篇主要讲静态代理和JDK的动态代理的原理,也是Router——一种Android中使用的高效、方便的事件总线解耦库实现的主要原理。

阅读全文

关于Activity,Window,View的关系一直有个模糊的印象,看别人的分析一般都这么理解Activity是管理Window,Window用来承载View,View是最终的视图,也有说Window的作用可有可无的,作用并不大的,并不是说这些观点有问题,而是看了这么多后,会更迷惑,管理是怎么管理的,承载是怎么实现的,如果不自己根据源码看一些,这些概念会一直是抽象的,遇到问题还是没法理解,例如:

1 . 在Activity里调用

1
2
WindowManager.LayoutParams wl = new WindowManager.LayoutParams();
getWindowManager().addView(mView,wl);

1
2
LayoutParams wmParams =...
addContentView(mView,wmParams); //activity里的方法

这两种方式背后的实现是怎样的,有什么区别?

阅读全文

分析这个过程不是单纯为跟一遍函数调用的流程,而是更好的理解平常用到的一些方法、对象的初始化时间,对象创建的个数,方法的先后顺序,以及每个类,方法背后的作用和目的。主要是一下几个问题:

  1. Application是什么时候创建的,每个应用程序有几个Application
  2. 应用的资源路径什么时候初始化的
  3. 应用中ContextImpl的个数
  4. Application.attach(),Activity.attach()的调用时机及作用
  5. Instrumentation的重要性及具体作用
  6. 点击Launcher启动Activity和应用内部启动Activity的区别
阅读全文

理解Binder框架

发布在 Android

Binder是Android系统进程间通信(IPC)最重要的方式。要想了解Android的系统原理,必须要先对Binder框架有一定的理解。Binder是什么?Binder可以理解为能在进程间进行”通信”的对象,这个通信不是指在不同进程中操作同一个对象,而应理解为一种通信协议。

Binder的引入背景

传统的进程间通信方式有管道,消息队列,共享内存等,其中管道,消息队列采用存储-转发方式,即数据先从发送方缓存区拷贝到内核开辟的缓存区中,然后再从内核缓存区拷贝到接收方缓存区,至少有两次拷贝过程。共享内存虽然无需拷贝,但控制复杂,难以使用。socket作为一款通用接口,其传输效率低,开销大,主要用在跨网络的进程间通信和本机上进程间的低速通信。Binder通过内存映射的方式,使数据只需要在内存进行一次读写过程。

阅读全文

正确解读ThreadLocal

发布在 Java基础

并发的学习与使用系列 第七篇

在Android的消息机制中,Handler是非常重要的一部分,而完全要理解Handler的机制,首先应该理解ThreadLocal,关于ThreadLocal,见到很多地方叫做线程本地变量,也有些地方叫做线程本地存储,其实意思差不多。可能很多人都知道ThreadLocal为变量在每个线程中都创建了一个副本,那么每个线程可以访问自己内部的副本变量,这样的词容易让人产生误解或者迷惑。

阅读全文

并发的学习与使用系列 第六篇

关于Asnynck有很多的源码解读,但一些解读现在看来已经不在适用了,比如AsyncTask类必须在UI Thread当中加载,AsyncTask的对象必须在UI Thread当中实例化等一些结论都是基于以前版本的代码来解读的,现在看来已经不是这样的了。同时分析了在AsyncTask的使用中存在的以及以及应该注意的问题,基于一些实际存在的问题尤其是并行串行问题,写了一个类似AsyncTask的库AsyncTaskScheduler,处理了上述的一些实际存在的问题。

阅读全文

并发的学习与使用系列 第五篇

线程池的技术背景

在面向对象编程中,创建和销毁对象是很费时间的,因为创建一个对象要获取内存资源或者其它更多资源。在Java中更是如此,虚拟机将试图跟踪每一个对象,以便能够在对象销毁后进行垃圾回收。

所以提高服务程序效率的一个手段就是尽可能减少创建和销毁对象的次数,特别是一些很耗资源的对象创建和销毁。如何利用已有对象来服务就是一个需要解决的关键问题,其实这就是一些”池化资源”技术产生的原因。

例如Android中常见到的很多通用组件一般都离不开”池”的概念 阅读全文

并发的学习与使用系列 第四篇

在Java中,开启一个线程的唯一方式是,是通过Thread的start方法,并且在线程中执行的Runnable的run方法。无论是线程池还是接下来要介绍的Callable,Future还是线程池,最核心最根本的还是调用到Thread.start()–>Runnable.run(),其他的类的出现可以认为是更方便的使用Thread和Runnable,以此为核心会更容易理解Java的并发框架。

虽然Thread和Runnable类使得多线程编程简单直接,但有一个缺陷就是:在执行完任务之后无法获取执行结果。如果需要获取执行结果,就必须通过共享变量或者使用线程通信的方式来达到效果,这样使用起来就比较麻烦。因此从Jdk1.5开始,有了一系列的类的出现来解决这些问题,如Callable和Future,FutureTask以及下篇要讲到的线程池从使用到原理学习Java线程池

阅读全文

并发的学习与使用系列 第三篇

synchronized是不错,但它并不完美。它有一些功能性的限制,比如

  • 它无法中断一个正在等候获得锁的线程,也无法通过投票得到锁。多线程竞争一个锁时,其余未得到锁的线程只能不停的尝试获得锁,而不能中断。
    高并发的情况下会导致性能下降。
  • synchronized上是非公平的,新来的线程有可能立即获得监视器,而在等待区中等候已久的线程可能再次等待。

而Lock的一些实现类则很好的解决了这些问题。

阅读全文

并发的学习与使用系列 第二篇

在多线程的操作中,最常用到synchronized关键字和volatile来控制线程的同步问题,要想正确的使用必须对其原理有一定的了解。接下来将通过对其原理的分析以及一些实际中的使用来具体分析它们起到的作用,以及一种可能未见过的单例模式来了解AtomicReference相关原子类的使用。

阅读全文

SilenceDut

talk is cheap,here are my blog


Android engineer


广东,广州