Activity,Fragment绑定生命周期,实现EventBus的自动注册、自动注销。

Glide中一个重要特性是Request可以随Activity或Fragment的onStart而resume,onStop而pause,onDestroy而clear,从而节约流量和内存,并且防止内存泄露。在阅读Glide相关源码后,其核心使用观察者模式,引入项目后实现EventBus的自动注册、自动注销。

观察者接口
public interface LifecycleListener {

    /**
     * 当Activity、Fragment执行onStart()方法时执行
     */
    void onStart();

    /**
     * 当Activity、Fragment执行onStar()方法时执行
     */
    void onStop();

    /**
     * 当Activity、Fragment执行onDestroy()方法时执行
     */
    void onDestroy();
}
观察者管理接口
public interface Lifecycle {
    /**
     * 添加观察者
     */
    void addListener(LifecycleListener listener);
}

观察者辅助管理类

public class ActivityFragmentLifecycle implements Lifecycle {
    private final Set<LifecycleListener> lifecycleListeners =
            Collections.newSetFromMap(new WeakHashMap<LifecycleListener, Boolean>());
    private boolean isStarted;
    private boolean isDestroyed;

    @Override
    public void addListener(LifecycleListener listener) {
        lifecycleListeners.add(listener);

        if (isDestroyed) {
            listener.onDestroy();
        } else if (isStarted) {
            listener.onStart();
        } else {
            listener.onStop();
        }
    }

    void onStart() {
        isStarted = true;
        for (LifecycleListener lifecycleListener : Util.getSnapshot(lifecycleListeners)) {
            lifecycleListener.onStart();
        }
    }

    void onStop() {
        isStarted = false;
        for (LifecycleListener lifecycleListener : Util.getSnapshot(lifecycleListeners)) {
            lifecycleListener.onStop();
        }
    }

    void onDestroy() {
        isDestroyed = true;
        for (LifecycleListener lifecycleListener : Util.getSnapshot(lifecycleListeners)) {
            lifecycleListener.onDestroy();
        }
    }
}
 被观察者Activity、Fragment 
public abstract class AbsActivity extends AppCompatActivity {

    private final ActivityFragmentLifecycle lifecycle = new ActivityFragmentLifecycle();

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

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

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

    public ActivityFragmentLifecycle getLifecycle() {
        return lifecycle;
    }
}
EventBus观察者,实现LifecycleListener
public class EventBusHandler implements LifecycleListener {

    private boolean mRegistered = false;

   //注册
    public EventBusHandler register() {
        if (!mRegistered) {
            mRegistered = true;
            EventCenter.getInstance().register(this);
            L.d("register");
        }
        return this;
    }

   //解除注册
    public EventBusHandler unregister() {
        if (mRegistered) {
            mRegistered = false;
            EventCenter.getInstance().unregister(this);
            L.d("unregister");
        }
        return this;
    }

    public synchronized void tryToRegisterIfNot() {
        register();
    }

    @Override
    public void onStart() {
        register();
    }

    @Override
    public void onStop() {

    }

    @Override
    public void onDestroy() {
        unregister();
    }

}
EevetCenter
public class EventCenter {
	private static final EventBus instance = new EventBus();

	private EventCenter() {
	}

	public static EventBusHandler bindContainerAndHandler(Lifecycle container, EventBusHandler handler) {
		container.addListener(handler);
		return handler;
	}

	public static final EventBus getInstance() {
		return instance;
	}
}
activity代码调用
EventCenter.bindContainerAndHandler(getLifecycle(), new EventBusHandler() {
            public void onEventMainThread(BlotterEvent event) {
               //获取事件进行相关操作
            }
        }).tryToRegisterIfNot();

当activity生命终止时会通知调用EventBusHandler的onDestroy()解除注册。

当Activity,Fragment的生命周期可观察时,所做的远远不止于此。如Glide提供的DefaultConnectivityMonitor监听网络是否可用。




  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值