像Glide一样绑定Activity的生命周期

本文介绍了一种模仿Glide框架的简易方法,用于绑定Activity的生命周期。通过自定义RequestManager类,实现生命周期监听,利用ManagerFragment获取Activity状态,确保图片加载逻辑随Activity状态变化而调整。

如何像Glide一样绑定Activity的生命周期呢,本文通过模拟Glide实现一个简单的绑定Activity生命周期的方法。本文尽量使用Glide一样的类名,删除不需要的业务,实现的思想大同小异。

1、业务类RequestManager

和Glide不同个,我们把业务类实现在RequestManager中,这里有几个生命周期的回调方法:
onStart()、onStop()、onDestory()
具体代码:

/**
 * 你的业务类,以及需要在生命周期做出想要反应处理
 */
public class RequestManager implements LifeCycleListener {
    private static final String TAG = RequestManager.class.getSimpleName();

    /**
     * 当然这里可能还有FragmentActivity,Fragment等参数,再此只给出一种方式,其他同理
     * @param activity 传入的上下文
     */
    public void bindFragment(Activity activity) {
        FragmentManager fragmentManager = activity.getFragmentManager();
        fragmentGet(fragmentManager, isActivityVisible(activity));
    }

    private void fragmentGet(FragmentManager fragmentManager, boolean activityVisible) {
        ManagerFragment current = new ManagerFragment();
        fragmentManager.beginTransaction().add(current, "managerLife").commitAllowingStateLoss();
        current.getLifeCycle().addListener(this);
    }

    private boolean isActivityVisible(Activity activity) {
        return !activity.isFinishing();
    }

    @Override
    public void onStart() {
        //do you buzz
        Log.i(TAG, "onStart: ");
    }

    /**
     * 当出现该函数时,可以暂停Glide网络图片的请求
     */
    @Override
    public void onStop() {
        //do you buzz
        Log.i(TAG, "onStop: ");
    }

    @Override
    public void onDestroy() {
        //do you buzz
        Log.i(TAG, "onDestroy: ");
    }
}

2、生命周期回调接口

在RequestManager的fragmentGet()方法中:
current.getLifeCycle().addListener(this);
RequestManager主要是实现了LifeCycleListener接口来获取生命周期,接口很简单:

public interface LifeCycleListener {
    /**
     * Callback for when {@link android.app.Fragment#onStart()}} or {@link
     * android.app.Activity#onStart()} is called.
     */
    void onStart();

    /**
     * Callback for when {@link android.app.Fragment#onStop()}} or {@link
     * android.app.Activity#onStop()}} is called.
     */
    void onStop();

    /**
     * Callback for when {@link android.app.Fragment#onDestroy()}} or {@link
     * android.app.Activity#onDestroy()} is called.
     */
    void onDestroy();
}

3、获取生命周期的类ManagerFragment

继续观察RequestManager的fragmentGet()方法:
current.getLifeCycle().addListener(this);
current是ManagerFragment实例,MangerFragment其实就是Fragment:

/**
 * 就是通过把该Fragment添加到Activity或其他上下文中来获取生命周期,然后让RequestManager
 */
public class ManagerFragment extends Fragment {
    private ActivityFragmentLifeCycle lifecycle;
    public ManagerFragment() {
        this(new ActivityFragmentLifeCycle());
    }

    @SuppressLint("ValidFragment")
    public ManagerFragment(@NonNull ActivityFragmentLifeCycle lifeCycle) {
        this.lifecycle = lifeCycle;
    }

    @NonNull
    ActivityFragmentLifeCycle getLifeCycle() {
        return lifecycle;
    }

    @Override
    public void onDetach() {
        super.onDetach();
    }

    @Override
    public void onStart() {
        super.onStart();
        lifecycle.onStart();
    }

    @Override
    public void onStop() {
        super.onStop();
        lifecycle.onStop();
    }

    @Override
    public void onDestroy() {
        super.onDestroy();
        lifecycle.onDestroy();
    }
}

其实就是创建了一个没有页面的Fragment,通过Fragment的生命周期来设置Glide的生命周期。

4、最后是ActivityFragmentLifeCycle

这个类可以不写,只是在ManagerFragment中需要设置一个无参构造函数,防止在调用ActivityFragmentLifeCycle时使用了无参构造函数,所以增加了一个持有LifeCycleListener的类:

public class ActivityFragmentLifeCycle {
    private LifeCycleListener lifecycleListener;

    public void addListener(@NonNull LifeCycleListener listener) {
        lifecycleListener = listener;
    }

    void onStart() {
        lifecycleListener.onStart();

    }

    void onStop() {
        lifecycleListener.onStop();

    }

    void onDestroy() {
        lifecycleListener.onDestroy();
    }
}

在glide中该类中有个集合类,通过addListener()方法可知可以添加多个生命周期的接口,但此处简化,只有一个地方监听。

5、最后使用

很简单,直接绑定下就可以了:

RequestManager requestManager = new RequestManager();
requestManager.bindFragment(this);

本文只是大致梳理了下Glide的生命周期,具体细节并未考虑。

<think>我们正在讨论Glide.with方法绑定生命周期对象及其影响。根据引用内容,我们可以总结如下: 1. **绑定对象**:Glide.with()方法可以接受多种上下文参数,包括Activity、Fragment、FragmentActivity、Context、View等。但实际绑定生命周期对象取决于参数类型: - 当参数是Activity或Fragment时,直接使用其生命周期。 - 当参数是Context(非Activity)或View时,Glide会尝试判断上下文环境。如果该Context属于一个Activity或Fragment,则创建一个无界面的SupportRequestManagerFragment(或RequestManagerFragment)并附加到该Activity上,从而绑定生命周期;否则,不会绑定生命周期(使用Application级别的生命周期)。 2. **绑定后的影响**: - 当绑定生命周期对象(如Activity)进入onStop时,Glide会暂停图片加载请求。 - 当生命周期对象进入onStart时,恢复暂停的请求(如果配置了在onStart时恢复)。 - 当生命周期对象进入onDestroy时,自动取消所有未完成的请求并清理相关资源,避免内存泄漏。 具体步骤分析(根据引用[1][3][4]): - 调用`Glide.with(activity)`时,会通过`RequestManagerRetriever`获取一个`RequestManager`。 - `RequestManagerRetriever`会创建一个无UI的`SupportRequestManagerFragment`(对于FragmentActivity)或`RequestManagerFragment`(对于Activity),并将其添加到Activity中。 - 这个Fragment内部持有`Lifecycle`对象,并将自己的生命周期事件通过`LifecycleListener`接口传递给`RequestManager`。 - `RequestManager`注册为生命周期的观察者,从而在生命周期变化时执行相应操作(暂停、恢复、清除请求)。 影响总结: - **避免内存泄漏**:通过绑定生命周期,确保在Activity/Fragment销毁时自动释放所有相关资源。 - **优化性能**:在不可见时(如onStop)暂停加载,减少不必要的网络请求和CPU消耗。 - **智能恢复**:当Activity回到前台时,自动恢复加载任务(需配置)。 相关问题: 1. Glide如何确保在非Activity上下文中也能安全使用? 2. 如果Activity被销毁重建,Glide如何处理已加载的图片? 3. 如何自定义Glide生命周期绑定行为? </think>### Glide.with() 绑定生命周期对象及影响分析 #### 一、生命周期绑定对象 1. **Activity/Fragment 对象** `Glide.with(activity)` 或 `Glide.with(fragment)` 直接绑定传入的 Activity/Fragment 生命周期[^1][^3]。 - **原理**:创建无界面的 `SupportRequestManagerFragment` 添加到 Activity - **关键类**:通过 `RequestManagerRetriever` 获取 `RequestManager`[^2] 2. **View/Context 对象** `Glide.with(view)` 或 `Glide.with(context)`: - 自动向上查找宿主 Activity(通过 View.getContext() 或 Context 层级) - 若找到 Activity绑定生命周期;否则使用 Application 级作用域[^4][^3] #### 二、绑定后的核心影响 1. **自动暂停/恢复加载** - ⏹️ `onStop()`:暂停所有网络请求和磁盘加载 - ▶️ `onStart()`:恢复未完成的任务(需配置 `onlyRetrieveFromCache(false)`)[^3] ```java // 伪代码:生命周期事件传递 fragment.onStop() → Lifecycle.onStop() → RequestManager.onStop() → 暂停引擎任务 ``` 2. **内存泄漏防护** - `onDestroy()`:自动取消所有请求,释放 Bitmap 引用 - 弱引用机制确保 Activity 销毁时请求被 GC 回收[^1][^3] 3. **缓存策略联动** - 绑定 Activity 时:内存缓存跟随生命周期清除(非 Application 级缓存) - 绑定 Application 时:全局缓存持久化[^2] 4. **线程调度优化** - ⚡ 主线程请求自动切换到 IO 线程加载 - 生命周期结束时终止后台线程任务[^1] #### 三、特殊场景影响 | **绑定对象类型** | **网络加载** | **内存缓存** | **生命周期感知** | |----------------|-------------|-------------|----------------| | Activity | 暂停/恢复 | 局部缓存 | ✔️ 完整感知 | | Application | 持续加载 | 全局缓存 | ❌ 无感知 | | 无宿主 Context | 持续加载 | 全局缓存 | ❌ 无感知 | > **示例**:在 `RecyclerView` 中使用时推荐绑定 `RecyclerView` 自身,Glide 会自动查找其宿主 Activity 实现生命周期绑定: > ```kotlin > holder.itemView.context?.let { > Glide.with(it).load(url).into(holder.imageView) > } // 自动关联 RecyclerView 所在 Activity > ``` #### 四、注意事项 1. **避免内存泄漏** 使用 `ApplicationContext` 的场景需手动管理资源,否则可能泄漏[^3]: ```java // 错误示例(可能泄漏): Glide.with(getApplicationContext()).load(url).into(imageView); // 正确做法(主动清理): RequestManager requestManager = Glide.with(getApplicationContext()); requestManager.load(url).into(imageView); onDestroy() { requestManager.clear(imageView); } ``` 2. **Fragment 特殊处理** `ViewPager` 中的 Fragment 需使用 `getChildFragmentManager()` 绑定,否则可能绑定到父 Activity 导致生命周期错乱[^4]。 ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值