Glide源码分析-生命周期管理

一:基本用法
Glide,Google推荐的图片加载库,使用起来非常简单,仅通过这一行代码,就可以下载图片加载到对应的ImageView。
Glide.with(this).load(“http://img3.imgtn.bdimg.com/it/u=3475579404,3927231637&fm=23&gp=0.jpg“).into(iv);这样调用,用的是Glide的默认配置,如果想用自己的配置,可以实现GlideModule接口,并在AndroidManifest.xml中注册,例如

public class FlickrGlideModule implements GlideModule {


    @Override
    public void applyOptions(Context context, GlideBuilder builder) {
        builder.setDecodeFormat(DecodeFormat.PREFER_RGB_565);
    }

    @Override
    public void registerComponents(Context context, Registry registry) {

    }
}
<meta-data                            android:name="com.bumptech.glide.samples.flickr.FlickrGlideModule"                       
android:value="GlideModule" />

Glide可以根据Activity/Fragment的生命周期来控制图片的加载。

和生命周期相关的类如下:
Lifecycle:用来监听Activity/Fragment的生命周期事件,包含addListener和removeListener两个方法。

LifecycleListener:监听Fragment/Activity生命周期事件的接口。包含onStart、onStop、onDestroy三个方法,当Fragment/Activity生命周期放生变化时,会调用对应的方法。实现类是RequestManager、ConnectivityMonitor、Target。

ActivityFragmentLifecycle:Lifecycle的实现类,用来跟踪和通知 Fragment/Activity监听器的生命周期变化。
在addListener方法中,把LifecycleListener添加到lifecycleListeners中,最新的生命周期方法将被调用,如果Activity/Fragment是暂停状态,LifecycleListener#onStop()方法会被调用,
onStart、onDestroy同理。ActivityFragmentLifecycle中还包含onStart、onStop、onDestroy三个方法,被调用的时候会遍历lifecycleListeners,调用LifecycleListener的对应的生命周期方法。

SupportRequestManagerFragment:一个没有视图的Fragment,持有ActivityFragmentLifecycle实例,并持有RequestManager实例,RequestManager可以启动、停止、管理Glide的requests请求。

当调用with方法开始一个下载,并绑定Activity/Fragment的生命周期。
绑定SupportRequestManagerFragment的方法是RequestManagerRetriever.getSupportRequestManagerFragment

//根据tag从FragmentManager里获取SupportRequestManagerFragment,
//如果不存在,从pendingSupportRequestManagerFragments里查找,
//如果依然为null,新建一个SupportRequestManagerFragment,
//存储在pendingSupportRequestManagerFragments里,并通过fm添加。
SupportRequestManagerFragment getSupportRequestManagerFragment(
      final FragmentManager fm, Fragment parentHint) {
    SupportRequestManagerFragment current =
        (SupportRequestManagerFragment) fm.findFragmentByTag(FRAGMENT_TAG);
    if (current == null) {
      current = pendingSupportRequestManagerFragments.get(fm);
      if (current == null) {
        current = new SupportRequestManagerFragment();
        current.setParentFragmentHint(parentHint);
        pendingSupportRequestManagerFragments.put(fm, current);
        fm.beginTransaction().add(current, FRAGMENT_TAG).commitAllowingStateLoss();
        handler.obtainMessage(ID_REMOVE_SUPPORT_FRAGMENT_MANAGER, fm).sendToTarget();
      }
    }
    return current;
  }

当系统调用SupportRequestManagerFragment.onAttach方法时,调用registerFragmentWithRoot方法,将Fragment的子Fragment关联的SupportRequestManagerFragment 添加到childRequestManagerFragments里。当调用onDetach方法时,说明Fragment不再和Activity相关联,这时要将SupportRequestManagerFragment从childRequestManagerFragments里移除,并将rootRequestManagerFragment置为空。
调用Fragment的onStart方法时,通过lifecycle.onStart();遍历lifecycleListeners,分别调用对应的onStart方法,例如,RequestManager的onStart方法的实现是
resumeRequests();
targetTracker.onStart();
重新开启失败或暂停的请求任务。

获取到SupportRequestManagerFragment之后,通过getRequestManager方法获取关联的RequestManager,如果为null,新建一个,并设置到SupportRequestManagerFragment。

RequestManagerRetriever#supportFragmentGet方法
//在RequestManager构造方法中,会通过addListener方法,将自身添加到SupportRequestManagerFragment的lifecycle中。
 Glide glide = Glide.get(context);
 requestManager = new RequestManager(glide, current.getLifecycle(),    current.getRequestManagerTreeNode());
 current.setRequestManager(requestManager);

通过以上几步,就可以通过Activity/Fragment的生命周期管理Request了。

网络变化后,如何重新开启下载任务?

RequestManager(
      Glide glide,
      Lifecycle lifecycle,
      RequestManagerTreeNode treeNode,
      RequestTracker requestTracker,
      ConnectivityMonitorFactory factory) {
    this.glide = glide;
    this.lifecycle = lifecycle;
    this.treeNode = treeNode;
    this.requestTracker = requestTracker;

    final Context context = glide.getGlideContext().getBaseContext();

......
    connectivityMonitor =
        factory.build(context, new RequestManagerConnectivityListener(requestTracker));
    lifecycle.addListener(connectivityMonitor);

    ......
  }

GlideBuilder中生成DefaultConnectivityMonitorFactory的实例。
在RequestManager构造方法中,通过DefaultConnectivityMonitorFactory的build方法创建ConnectivityMonitor的实现类,DefaultConnectivityMonitor(如果有网络权限)。然后再通过lifecycle的add方法注册。当调用DefaultConnectivityMonitor的onStart方法时,注册广播,监听网络变化。当调用onStop()时,取消注册广播。当收到广播变化通知时,调用
listener.onConnectivityChanged(isConnected);(listener是RequestManagerConnectivityListener(requestTracker)的实例),如果有网络,调用requestTracker.restartRequests()的方法,重新开启请求。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值