Android SDK 26 以下如何使用 AutoDispose 来解决Rxjava 泄露问题

现在国内大多数使用Rxjava的开发者对于生命周期的管控大部分才用的是Rxlifecycle

但是Rxlifecycle作者的发表却一篇了名为什么不是RxLifecycle?

大体上听出来作者想推荐我们使用uber的AutoDispose去解决这个问题

国内看搜索的引擎提供的信息大多数的英文一位名为却把清梅嗅 的作者发布的文章这的英文他的github上同时感谢他给予我的帮助!

AutoDispose github中提供的例子是基于最新API的所以在使用的时候他们可以使用Activity的这个

myObservable
    .doStuff()
    .as(autoDisposable(AndroidLifecycleScopeProvider.from(this)))   // The magic
    .subscribe(s -> ...);
复制代码

官方提示描述 as 这段代码 为魔法代码
我们通过查看源码得知autoDisposable()需要的是 LifecycleScopeProvider<?> provider
而AndroidLifecycleScopeProvider.from(this)需要的是LifecycleOwner 接口
from 返回的类型是AndroidLifecycleScopeProvider他实现了接口LifecycleScopeProvider
from 是个转换器 将 this lifeCycleOwner 转为了 LifecycleScopeProvider 交给AutoDispose
autoDisposable 也相当于一个转换器,将LifecycleScopeProvider 转为 AutoDisposeConverter 并且
实现了 ObservableConverter 可以交由 as 操作符处理。(勿喷,Rxjava原理未看)
总结来说就是 需要Activity 实现LifecyclerOwner 然后就可以一行代码将Rxjava 恼人的生命周期绑定在当前Activity上。
但是!API 26 以下官方可没有实现这个
在API26以及以上版本中我们很容易的就完成了使用直接传入这即可。
因为AppCompatActivity已经实现了 LifecycleOwner 接口
这里说的不太准确确切来说是 AppCompatActivity 继承的活动实现了这个接口我们追到源头发现是 SupportActivity
实现了LifecycleOwner 接口所以我们就可以直接使用这个了。
回归原题如何在APi 26一下使用呢,当然是我们自己实现一套这样的逻辑了。
首先将我们的BaseActivity实现LifecycleOwner 接口

  private LifecycleRegistry mLifecycleRegistry = new LifecycleRegistry(this);

    @Override
    public Lifecycle getLifecycle() {
        return mLifecycleRegistry;
    }

    @Override
    protected void onSaveInstanceState(Bundle outState) {
        mLifecycleRegistry.markState(Lifecycle.State.CREATED);
        super.onSaveInstanceState(outState);
    }
复制代码

然后创建一个名为ReportFragmentIO的类内容如下 其实可以随便起看君心情

public class ReportFragmentIO extends Fragment {
    private static final String REPORT_FRAGMENT_TAG = "report_fragment_tag";

    public static void injectIfNeededIn(Activity activity) {
        // ProcessLifecycleOwner应始终正常工作,某些活动可能无法扩展
        // 来自支持lib的FragmentActivity,因此我们使用框架片段进行活动
        android.app.FragmentManager manager = activity.getFragmentManager();
        if (manager.findFragmentByTag(REPORT_FRAGMENT_TAG) == null) {
            manager.beginTransaction().add(new ReportFragmentIO(), REPORT_FRAGMENT_TAG).commit();
            //希望我们是第一个进行交易的人.   鬼知道之前是什么注释了被百度翻译了下 
            manager.executePendingTransactions();
        }
    }

    static android.arch.lifecycle.ReportFragment get(Activity activity) {
        return (android.arch.lifecycle.ReportFragment) activity.getFragmentManager().findFragmentByTag(
                REPORT_FRAGMENT_TAG);
    }

    private ActivityInitializationListener mProcessListener;

    private void dispatchCreate(ActivityInitializationListener listener) {
        if (listener != null) {
            listener.onCreate();
        }
    }

    private void dispatchStart(ActivityInitializationListener listener) {
        if (listener != null) {
            listener.onStart();
        }
    }

    private void dispatchResume(ActivityInitializationListener listener) {
        if (listener != null) {
            listener.onResume();
        }
    }

    @Override
    public void onActivityCreated(@Nullable Bundle savedInstanceState) {
        super.onActivityCreated(savedInstanceState);
        dispatchCreate(mProcessListener);
        dispatch(Lifecycle.Event.ON_CREATE);
    }


    @Override
    public void onStart() {
        super.onStart();
        dispatchStart(mProcessListener);
        dispatch(Lifecycle.Event.ON_START);
    }

    @Override
    public void onResume() {
        super.onResume();
        dispatchResume(mProcessListener);
        dispatch(Lifecycle.Event.ON_RESUME);
    }

    @Override
    public void onPause() {
        super.onPause();
        dispatch(Lifecycle.Event.ON_PAUSE);
    }

    @Override
    public void onStop() {
        super.onStop();
        dispatch(Lifecycle.Event.ON_STOP);
    }

    @Override
    public void onDestroy() {
        super.onDestroy();
        dispatch(Lifecycle.Event.ON_DESTROY);
        //只是想确保我们不会泄漏对Activity的引用
        mProcessListener = null;
    }

    private void dispatch(Lifecycle.Event event) {
        Activity activity = getActivity();
        if (activity instanceof LifecycleRegistryOwner) {
            ((LifecycleRegistryOwner) activity).getLifecycle().handleLifecycleEvent(event);
            return;
        }

        if (activity instanceof LifecycleOwner) {
            Lifecycle lifecycle = ((LifecycleOwner) activity).getLifecycle();
            if (lifecycle instanceof LifecycleRegistry) {
                ((LifecycleRegistry) lifecycle).handleLifecycleEvent(event);
            }
        }
    }

    void setProcessListener(ActivityInitializationListener processListener) {
        mProcessListener = processListener;
    }

    interface ActivityInitializationListener {
        void onCreate();

        void onStart();

        void onResume();
    }

}

复制代码

然后再在我们的BaseActivity的的onCreate中添加一行

ReportFragmentIO.injectIfNeededIn(this);

至此我们就可以在任何继承我们的BaseActivity的活动中如同API26中一样使用了

因为我们的项目中大多数用的是MVP架构所以网络请求一般都会在P里面进行请求

所以接下来会考虑在P中进行绑定生命周期! (存稿并非近日撰写)

转载于:https://juejin.im/post/5bc47fe35188255c6e708b63

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值