第三方开源库 RxJava Android实用开发场景

到底什么状况下可使用 RxJava ? 咱们须要知道不是使用 RxJava 而是响应式编程,好吧,那到底何时能够响应式编程?按道理来说,咱们写任何代码均可以采用响应式编程的思想,只不过是有没有必要而已。罗列一些使用场景:编程

  1. 防止按钮重复点击;
RxView.clicks(mClearContent).debounce(300, TimeUnit.MILLISECONDS)
复制代码
  1. EditText 添加 addTextChangedListener
RxTextView.textChanges(mUserNameEt)
复制代码
  1. 延迟执行
Observable.timer(3, TimeUnit.SECONDS)
复制代码
  1. 不断轮询
Observable.interval(3, 3, TimeUnit.SECONDS)
复制代码
  1. 减小频繁调用
RxTextView.textChanges(mUserNameEt).debounce(1200, TimeUnit.MILLISECONDS)
复制代码
  1. RxPermission请求权限
rxPermissions.request(Manifest.permission.CAMERA)
复制代码

####2.RxPermission 源码分析 上面的用法真的是少得可怜,多是我也用得比较少,其实还有一些如 RxBus + RxRelay,OkHttp + RxJava + Retrofit,MVP + Dragger + RxJava 等等,但这些目前一时半会还讲不清楚,但愿后面分析完 Retrofit 源码后能说清楚一些皮毛。咱们仍是老老实实来看看 RxPermission 的源码?不是说好讲使用怎么又讲源码,为何非得跟源码过不去?待会后面你就知道了。先看下使用(申请相机权限):bash

RxPermissions rxPermissions = new RxPermissions(this);
rxPermissions.request(Manifest.permission.CAMERA).subscribe(new Consumer<Boolean>() {
  @Override
  public void accept(Boolean aBoolean) throws Exception {
      if(aBoolean){
        // 有权限
      }else {
        // 没权限
      }
  }
});
复制代码

回想一下咱们在不用任何框架的时候,去申请权限那得多少代码啊~,关键是还须要重载 Activity 的 onRequestPermissionsResult() ,都怀疑人生了。后来本身好不容易写了个注解权限框架,可是当看到 RxPermission 就弃坑了,看看怎么实现的:markdown

public Observable<Boolean> request(final String... permissions) {
        return Observable.just(TRIGGER).compose(ensure(permissions));
    }

    public <T> ObservableTransformer<T, Boolean> ensure(final String... permissions) {
        return new ObservableTransformer<T, Boolean>() {
            @Override
            public ObservableSource<Boolean> apply(Observable<T> o) {
                return request(o, permissions)
                        // Transform Observable<Permission> to Observable<Boolean>
                        .buffer(permissions.length)
                        .flatMap(new Function<List<Permission>, ObservableSource<Boolean>>() {
                            @Override
                            public ObservableSource<Boolean> apply(List<Permission> permissions) throws Exception {
                                if (permissions.isEmpty()) {
                                    // Occurs during orientation change, when the subject receives onComplete.
                                    // In that case we don't want to propagate that empty list to the // subscriber, only the onComplete. return Observable.empty(); } // 若是有用户没有受权的权限,返回false // Return true if all permissions are granted. for (Permission p : permissions) { if (!p.granted) { return Observable.just(false); } } // 返回受权成功 return Observable.just(true); } }); } }; } @TargetApi(Build.VERSION_CODES.M) private Observable<Permission> requestImplementation(final String... permissions) { // 根据须要申请的权限建立一个 Observable 集合 List<Observable<Permission>> list = new ArrayList<>(permissions.length); // 用来存放没有授予的权限 List<String> unrequestedPermissions = new ArrayList<>(); // In case of multiple permissions, we create an Observable for each of them. // At the end, the observables are combined to have a unique response. for (String permission : permissions) { mRxPermissionsFragment.log("Requesting permission " + permission); // 把须要申请的权限加入集合 if (isGranted(permission)) { // Already granted, or not Android M // Return a granted Permission object. list.add(Observable.just(new Permission(permission, true, false))); continue; } if (isRevoked(permission)) { // Revoked by a policy, return a denied Permission object. list.add(Observable.just(new Permission(permission, false, false))); continue; } PublishSubject<Permission> subject = mRxPermissionsFragment.getSubjectByPermission(permission); // Create a new subject if not exists if (subject == null) { unrequestedPermissions.add(permission); subject = PublishSubject.create(); mRxPermissionsFragment.setSubjectForPermission(permission, subject); } list.add(subject); } // 若是有权限没有受权,去申请 if (!unrequestedPermissions.isEmpty()) { String[] unrequestedPermissionsArray = unrequestedPermissions.toArray(new String[unrequestedPermissions.size()]); requestPermissionsFromFragment(unrequestedPermissionsArray); } return Observable.concat(Observable.fromIterable(list)); } // 调用本身额外建立的 Fragment 的申请权限方法 @TargetApi(Build.VERSION_CODES.M) void requestPermissionsFromFragment(String[] permissions) { mRxPermissionsFragment.log("requestPermissionsFromFragment " + TextUtils.join(", ", permissions)); mRxPermissionsFragment.requestPermissions(permissions); } 复制代码

源码其实很简单,就那么几个类,咱们之因此不须要在 Activity 中重写 onRequestPermissionsResult 方法了,那是由于 RxPermission 本身额外建立了一个 Fragment ,加载到了咱们的 Activity 中,so easy 。架构

####3.RxLogin 库封装 最后咱们根据响应式编程的思想,参照 RxPermission 的源码思想,本身动手来打造一个 RxLogin 第三方登陆框架。我通常都是用友盟第三方的:app

public class UserLoginActivity extends Activity implements UMAuthListener {
    private UMShareAPI mUmShareAPI;
    public static final String PLATFORM_KEY = "PLATFORM_KEY";
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        mUmShareAPI = UMShareAPI.get(this);
        mUmShareAPI.doOauthVerify(this,SHARE_MEDIA.QQ, this);
    }

    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        super.onActivityResult(requestCode, resultCode, data);
        UMShareAPI.get(this).onActivityResult(requestCode, resultCode, data);
    }

    @Override
    public void onStart(SHARE_MEDIA share_media) {
        
    }

    @Override
    public void onComplete(SHARE_MEDIA share_media, int i, Map<String, String> map) {
        // 获取参数用户信息,调用后台接口,请求登陆
    }

    @Override
    public void onError(SHARE_MEDIA share_media, int i, Throwable throwable) {
        // 获取等三方帐号信息出错
    }

    @Override
    public void onCancel(SHARE_MEDIA share_media, int i) {
        // 取消第三方登陆
    }
}
复制代码

上面这种写法,咱们初级刚入门的时候通常会这么写,这样写到底行不行,也不说不行,也不说不对。可是通常咱们不会直接依赖第三方(隔离),并且其实还会多出来不少方法像 onActivityResult() 、onStar()、onCancel() 等等一些咱们可能都不须要或者说不想关注,可是又不得已,哎。框架

下面咱们本身动手写一个RxLogin,一方面不与第三方的框架直接依赖(隔离),还有一方面咱们过滤掉不关心的方法,还有一方面咱们项目中若是有 Retrofit 、MVP 这些那会更加完美一些,固然还有一些其余方面。须要额外新建 5 个类,5个类有点多,若是你想放弃:ide

public class RxLogin implements UMAuthListener {
    private Activity activity;
    private RxLoginResult mLoginResult;
    private PublishSubject<RxLoginResult> mLoginEmitter;
    static UMAuthListener STATIC_LISTENER;

    private RxLogin(Activity activity){
        this.activity = activity;
        mLoginResult = new RxLoginResult();
        STATIC_LISTENER = this;
        mLoginEmitter = PublishSubject.create();
    }

    public Observable<RxLoginResult> doOauthVerify(final RxLoginPlatform platform) {
        mShareResult.setPlatform(platform);
        Intent intent = new Intent(activity,RxLoginActivity.class);
        intent.putExtra(PLATFORM_KEY,platform);
        activity.startActivity(intent);
        activity.overridePendingTransition(0,0);
        List<Observable<RxLoginResult>> list = new ArrayList<>(1);
        list.add(mLoginEmitter);
        return Observable.concat(list);
    }

    @Override
    public void onStart(SHARE_MEDIA share_media) {

    }

    @Override
    public void onComplete(SHARE_MEDIA share_media, int i, Map<String, String> map) {
        mLoginResult.setIsSucceed(true);
        mLoginResult.setUserInfo(map);
        mLoginEmitter.onNext(mLoginResult);
    }

    @Override
    public void onError(SHARE_MEDIA share_media, int i, Throwable throwable) {
        mLoginResult.setIsSucceed(false);
        mLoginEmitter.onNext(mLoginResult);
        throwable.printStackTrace();
    }

    @Override
    public void onCancel(SHARE_MEDIA share_media, int i) {
        mLoginResult.setIsSucceed(false);
        mLoginEmitter.onNext(mLoginResult);
    }

    static final SHARE_MEDIA platformChange(RxLoginPlatform platform){
        switch (platform){
            case Platform_QQ:
                return SHARE_MEDIA.QQ;
            case Platform_WX:
                return SHARE_MEDIA.WEIXIN;
        }
        return SHARE_MEDIA.WEIXIN;
    }

    public static RxLogin create(Activity activity){
        return new RxLogin(activity);
    }
}
复制代码

看下最后的使用:oop

public class UserLoginActivity extends Activity implements UMAuthListener {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        // RxLogin 使用方式以下:
        RxLogin.create(this)
            // 第三QQ登陆
            .doOauthVerify(RxLoginPlatform.Platform_QQ)
            .subscribe(new Consumer<RxLoginResult>() {
                @Override
                public void accept(RxLoginResult rxLoginResult) throws Exception {
                if(rxLoginResult.isSucceed()){
                    // 调用后台接口,请求登陆
                }
            }
        });
    }
}
复制代码

全部分享大纲:Android进阶之旅 - 系统架构篇源码分析

视频讲解地址:https://pan.baidu.com/s/1pKCrVeFui

相关文章
相关标签/搜索