博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Android SDK 26 以下如何使用 AutoDispose 来解决Rxjava 泄露问题
阅读量:6894 次
发布时间:2019-06-27

本文共 4915 字,大约阅读时间需要 16 分钟。

现在国内大多数使用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

你可能感兴趣的文章
import com.sun.image.codec.jpeg.JPEGCodec不通过 找不到包
查看>>
adrci中的purge
查看>>
前台对Seajs的用法个人见解
查看>>
java中的队列同步器AQS -- AbstractQueuedSynchronizer
查看>>
centos 脚本基础练习9
查看>>
我的友情链接
查看>>
GET和POST,有什么区别
查看>>
Android内存优化
查看>>
windows 安全策略
查看>>
Druid MiddleManager Config 设置(默认只允许2个任务)
查看>>
jQuery插件
查看>>
数字3为分隔
查看>>
查看MySQL表占用空间大小
查看>>
华章11-12月份新书简介(2017年)
查看>>
第三周作业
查看>>
Vector、ArrayList、List使用深入剖析
查看>>
【调试】Core Dump是什么?Linux下如何正确永久开启?
查看>>
新浪微博API授权
查看>>
电子政务网中信息共享机制的重要性
查看>>
Tomcat_本地项目host配置Server.xml
查看>>