glide:
1、Glide的加载顺序是先从内存中获取,若没有则从磁盘中获取,在没有则通过网络获取。从网络上获取到了图片之后若设置了可缓存,则会缓存到磁盘中;然后在通过相应的加载参数进行解码压缩裁剪等操作之后得到图片设置给ImageView,同时缓存到内存中。Lru缓存
2、创建一个透明的 RequestManagerFragment 加入到FragmentManager 之中,通过添加的这个 Fragment 感知 Activity 、Fragment 的生命周期。
3、Glide在开始加载图片时,会给当前ViewTarget设置对应的Request,同时也会ViewTarget中的View设置tag为Request。在listView复用时有了这个Tag值,从而解决错乱的问题
4、Glide原理的核心是为bitmap维护一个对象池。对象池的主要目的是通过减少大对象内存的分配以重用来提高性能。
eventBus:
使用场景:
1、注册时传入目标类对象,然后利用反射筛选出 @Subscribe 的方法,然后以相同的参数类型为 key,将不同的方法合并为 list 作为 value,得到一个 map 集合;
2、当用户 post 数据时,再以数据类型为 key,从 map 中取出对应的方法 list,然后遍历 list,再利用反射机制对指定的方法执行 invoke 操作,完成调用;
okhttp:
1、Client都有自己的一个连接池connection pool和线程池thread pools,支持并发请求
2、链式调用,有层次的拦截器,RetryAndFollowUpInterceptor,负责重试和重定向,BridgeInterceptor,首先将应用层的数据类型转换为网络调用层的数据类型,然后将网络层返回的数据类型转换为应用层的数据类型,CacheInterceptor,负责读取缓存,更新缓存,ConnectInterceptor,负责和服务器建立起链接,networkInterceptors,client设置的networkInterceptor
,CallServerInterceptor,负责向服务器发送请求数据、从服务器读取响应数据
dagger:
依赖注入框架,Dagger2解决问题的基本思想是:利用生成和写的代码混合达到看似所有的产生和提供依赖的代码都是手写的样子。主要注解
@Inject:需要注入的成员或方法的注解
@Module:提供依赖,即我们常用的new出来的实例
@Provides:Module中提供依赖的方法注解
@Component:注入的纽带,关联需要注入的@Inject和@Module依赖
@Scope:作用域声明,如@Singleton即是一个默认的声明
Dagger2自动生成代码的原理是 通过apt插件在编译时期生成相应的注入代码,接下来我们就一个一个的分析。
RxJava
1、rx线程切换的核心,就是handler,说白了,rx为我们封装了handler
首先我们找一下入口 AndroidSchedulers.mainThread() 这个地方应该是就是入口了,我们看一下 AndroidSchedulers 这个类的源码吧,总共也没几行
private static final class MainHolder {
static final Scheduler DEFAULT = new HandlerScheduler(new Handler(Looper.getMainLooper()));
}
private static final Scheduler MAIN_THREAD = RxAndroidPlugins.initMainThreadScheduler(
new Callable() {
@Override public Scheduler call() throws Exception {
return MainHolder.DEFAULT;
}
}
);
public static Scheduler mainThread() {
return RxAndroidPlugins.onMainThreadScheduler(MAIN_THREAD);
}
public static Scheduler from(Looper looper) {
if (looper == null) throw new NullPointerException("looper == null");
return new HandlerScheduler(new Handler(looper));
}
这个应该不用我多说大家都能看明白,看到这里我们基本上明白了 RxAndroid 就是通过 Handler 来拿到主线程的
我们拿 subscribeOn() 中的一些流程来说
public Disposable scheduleDirect(@NonNull Runnable run, long delay, @NonNull TimeUnit unit) {
final Worker w = createWorker();
final Runnable decoratedRun = RxJavaPlugins.onSchedule(run);
DisposeTask task = new DisposeTask(decoratedRun, w);
w.schedule(task, delay, unit);
return task;
}
首先我们看到调用了 createWorker() 这是个抽象方法我们找到具体实现类 HandlerScheduler
public Worker createWorker() {
return new HandlerWorker(handler);
}
单纯的创建一个 Worker 并把主线程的 Handler 传进去,然后调用 Worker 的 schedule() 方法
public Disposable schedule(Runnable run, long delay, TimeUnit unit) {
/**忽略一些代码**/
run = RxJavaPlugins.onSchedule(run);
ScheduledRunnable scheduled = new ScheduledRunnable(handler, run);
Message message = Message.obtain(handler, scheduled);
message.obj = this; // Used as token for batch disposal of this worker's runnables.
handler.sendMessageDelayed(message, unit.toMillis(delay));
if (disposed) {
handler.removeCallbacks(scheduled);
return Disposables.disposed();
}
return scheduled;
}
到这里看明白 RxJava 如何通过 RxAndroid 来切换到主线程运行,其实 RxAndroid 的核心就是 Handler
Jetpack
Jetpack 是一套库、工具和指南,可帮助开发者更轻松地编写优质应用。这些组件可帮助您遵循最佳做法、让您摆脱编写样板代码的工作并简化复杂任务,以便您将精力集中放在所需的代码上。
Data Binding: MVVM的一种实践
Lifecycles: 管理你的 Activity 和 Fragment 生命周期