Glide源码解析01-with

Glide源码解析01-with

最简单的Glide调用,如下所示,下面将根据Glide的调用顺序,进行源码解析。

Glide.with(this)
        .load(uri)
        .into(img);

With方法

先来看with方法

简析

With方法有很多重载。
包括FragmentActivity、Activity、Fragment、Fragment v4。
with方法中,会与传入的这些类的生命周期进行绑定。
[ 前提是在主线程执行with(),否则会和Application的声明周期绑定。]

AppCompatActivity继承自FragmentActivity

详情

以FragmentActivity的重载为例。

1.0 Glide.with()

内部会先获取RequestManagerRetriever对象,
RequestManagerRetriever的作用是创建新的RequestManager或从activities和fragment中获取已存在的RequestManager。

public static RequestManager with(FragmentActivity activity) {
    RequestManagerRetriever retriever = RequestManagerRetriever.get();
    return retriever.get(activity);
}  
1.1 retriever.get(FragmentActivity)

内部会判断当前线程。
如果是异步线程,那么调用get(Context)和Application的声明周期绑定
如果是主线程,那么调用supportFragmentGet()和activity声明周期绑定

public RequestManager get(FragmentActivity activity) {
    if (Util.isOnBackgroundThread()) {
        return get(activity.getApplicationContext());
    } else {
        assertNotDestroyed(activity);
        FragmentManager fm = activity.getSupportFragmentManager();
        return supportFragmentGet(activity, fm);
    }
}
1.2 RequestManager#get(Context):绑定Application生命周期

内部会调用RequestManager#getApplicationManager(),从而传入context创建一个RequestManager。

private RequestManager getApplicationManager(Context context) {
    if (是否为空和加锁) { //单例
        applicationManager = new RequestManager(context.getApplicationContext(),
                new ApplicationLifecycle(), new EmptyRequestManagerTreeNode());
    }
    return applicationManager;
}
1.3 RequestManager#supportFragmentGet(): 绑定FragmentActivity生命周期

SupportRequestManagerFragment是Glide自己写的一个Fragment,是一个隐藏的Fragment。
Glide通过这个Fragment就可以监听到Activity的生命周期,从而绑定Activity的生命周期。

RequestManager supportFragmentGet(Context context, FragmentManager fm) {
    //如果存在则获取,不存在则创建SupportRequestManagerFragment
    SupportRequestManagerFragment current = getSupportRequestManagerFragment(fm);
    //检查SupportRequestManagerFragment中RequestManager是否存在
    RequestManager requestManager = current.getRequestManager();
    if (requestManager == null) {
        requestManager = new RequestManager(context, current.getLifecycle(), current.getRequestManagerTreeNode());
        current.setRequestManager(requestManager);
    }
    return requestManager;
}

至此,Glide.with方法就执行完了,并返回RequestManager对象。

更多

Glide源码解析01-with
Glide源码解析02-load
Glide源码解析03-into
Glide源码解析04-decode
Glide源码解析05-onLoadComplete
Glide源码解析06-Glide流程图

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

氦客

你的鼓励是我创作最大的动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值