美文网首页
RxActivityResult,一种优雅的方式实现startA

RxActivityResult,一种优雅的方式实现startA

作者: 暮暮频顾惜 | 来源:发表于2021-01-14 11:30 被阅读0次

    RxActivityResult

    一种优雅的方式实现startActivityForResult,将Android中的startActivityForResult()事件转换为Rx事件流

    github地址:https://github.com/VictorAlbertos/RxActivityResult
    作者:VictorAlbertos

    常规写法

    • MainResultActivity(Result的请求者)
    • SecondResultActivity(Result的发送者)
    sequenceDiagram
    MainResultActivity->>SecondResultAcitivity: requestCode
    SecondResultAcitivity->>MainResultActivity: result
    

    MainResultActivity

    public class MainResultActivity extends AppCompatActivity {
        
        //我们需要自己写一个常量作为requestCode,在请求result时传递进去
        public static final int REQUEST_CODE_NORMAL = 100;
        
        //我们省略其他无关紧要代码
        //打开新的界面,请求result
        public void startByNormal() {
            startActivityForResult(new Intent(this,
                            SecondResultActivity.class),
                    REQUEST_CODE_NORMAL);
        }
        
        //获得Result数据并处理
        @Override
        protected void onActivityResult(int requestCode, int resultCode, Intent data) {
            super.onActivityResult(requestCode, resultCode, data);
            if (requestCode == REQUEST_CODE_NORMAL) {
                String content = data.getStringExtra("content");
                tvResult.setText("传回来的内容:");
                tvResult.append(content);
            }
        }
    
    }
    

    SecondResultActivity

    public class SecondResultActivity extends AppCompatActivity {   
    
        //我们省略其他无关紧要代码
        //发送Result数据给请求方,然后finish()
         public void commitResult() {
            Intent intent = new Intent(this,MainResultActivity.class);
            intent.putExtra("content",etContent.getText().toString());
            setResult(1,intent);
            finish();
        }
    }
    

    RxActivityResult

    • 添加依赖
      1. 在Project级别的build.gradle中添加:
      allprojects {
       repositories {
           jcenter()
           maven { url "https://jitpack.io" }
       }
      }
      
      1. 在module级别的build.gradle中添加:
       dependencies {
           compile 'com.github.VictorAlbertos:RxActivityResult:0.4.5-2.x'
           compile 'io.reactivex.rxjava2:rxjava:2.0.5'
       }
      
    • MainResultActivity
    public class MainResultActivity extends AppCompatActivity {
      //这是一个Button点击后调用的方法:
      //打开新的界面,请求result,并进行数据结果的处理
      public void startByRxActivityResult() {
            RxActivityResult.on(this)
                    .startIntent(new Intent(this, SecondResultActivity.class))//请求result
                    .map(result -> result.data())//对result的处理,转换为intent
                    .subscribe(intent -> showResultIntentData(intent));//处理数据结果
      }
      
      //处理数据结果
      public void showResultIntentData(Intent data) {
          String content = data.getStringExtra("content");
          tvResult.setText("传回来的内容:");
          tvResult.append(content);
      }
    }
    

    SecondResultActivity中的处理不变。
    startByRxActivityResult()方法中,一行代码的链式调用即可完成:

    ① 打开新的界面,请求result
    ② 进行数据结果的处理
    ③ 不需要自己实现一个常量作为requestCode,并在请求result时传递进去

    在subscribe()的onNext()回调中返回的Result对象是作者封装的一个类,我们可以从中取得很多东西:

    public class Result<T> {
        private final T targetUI;//订阅事件发生时所在的容器,本文中为MainResultActivity.
        private final int resultCode;//resultCode
        private final int requestCode;//requestCode
        private final Intent data;//存储数据的Intent对象
    
        public Result(T targetUI, int requestCode, int resultCode, Intent data) {
            this.targetUI = targetUI;
            this.resultCode = resultCode;
            this.requestCode = requestCode;
            this.data = data;
        }
    
        public int requestCode() {
            return this.requestCode;
        }
    
        public int resultCode() {
            return this.resultCode;
        }
    
        public Intent data() {
            return this.data;
        }
    
        public T targetUI() {
            return this.targetUI;
        }
    }
    

    总结

    RxJava强大在于其操作符,如果我们能够合理利用操作符,我们的代码能够变得更加简洁。

    相关文章

      网友评论

          本文标题:RxActivityResult,一种优雅的方式实现startA

          本文链接:https://www.haomeiwen.com/subject/qfxvaktx.html