IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 移动开发 -> Android onActivityResult优雅的回调 -> 正文阅读

[移动开发]Android onActivityResult优雅的回调

青钢影说,优雅,永不过时

想优雅吗 赶紧拿起电脑访问:??????GitHub - VictorAlbertos/RxActivityResult: A reactive-tiny-badass-vindictive library to break with the OnActivityResult implementation as it breaks the observable chain.

RxActivityResult

The api which Android SDK exposes to retrieve the data from a 'returning system call' (camera, gallery, email...) just does not give a shit about?Don't break the chain?leitmotiv. Indeed, the?OnActivityResult?approach will break entirely your observable chaining.

I did this library to not have to deal with this?OnActivityResult?pattern. Never. Ever.

RxActivityResult features:

  • Launch the intent from any class, as long as you supply a valid?Activity?or?Fragment?instance.
  • Get the?Intent?back with the data encapsulated in an?observable?and keep going crazy chaining operators.

Setup

Add the JitPack repository in your build.gradle (top level module):

allprojects {
    repositories {
        jcenter()
        maven { url "https://jitpack.io" }
    }
}

And add next dependencies in the build.gradle of the module:

dependencies {
    implementation 'com.github.VictorAlbertos:RxActivityResult:0.5.0-2.x'
    implementation 'io.reactivex.rxjava2:rxjava:2.2.3'
}

Usage

Call?RxActivityResult.register?in your Android?Application?class, supplying as parameter the current instance.

public class SampleApp extends Application {

    @Override public void onCreate() {
        super.onCreate();
        RxActivityResult.register(this);
    }
}

You can call?RxActivityResult.on(this).startIntent(intent)?supplying both, an?Activity?instance or a?Fragment?instance. Observe the emitted?Result?item to know the resultCode and retrieve the associated data if appropriate.

Limitation:?Your fragments need to extend from?androidx.fragment.app.Fragment?instead of?android.app.Fragment, otherwise they won't be notified.

Intent takePhoto = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);

RxActivityResult.on(this).startIntent(takePhoto)
        .subscribe(result -> {
            Intent data = result.data();
            int resultCode = result.resultCode();
            // the requestCode using which the activity is started can be received here.
            int requestCode = result.requestCode();

            if(requestCode == YourActivity.YOUR_REQUEST_CODE)
            {
                // Do Something
            }

            if (resultCode == RESULT_OK) {
                result.targetUI().showImage(data);
            } else {
                result.targetUI().printUserCanceled();
            }
        });

是不是感觉脑袋瓜哇哇的根本看不懂

正常我们是访问一个intent

        .capture(false)
                .captureStrategy(false, getPackageName() + ".fileProvider", "kaikeba")
                .enableCorp(true)
                .start(REQUEST_CODE_CHOOSE);

传递一个?REQUEST_CODE_CHOOSE

然后再onActivityResult中处理返回的数据

这样非常的不优雅。

所以

我们可以使用这种方式

RxActivityResult.on(activity).startIntent(intent)
    public Observable<Result<Activity>> startByRxActivityResult() {
        Activity activity = mMatisse.getActivity();
        if (activity == null) {
            return null;
        }

        Intent intent = new Intent(activity, PictureSelectActivity.class);

       return RxActivityResult.on(activity).startIntent(intent);




    }

那么哎怎么处理失败呢?怎么更优雅那? 用过rx的就知道

    Observable<Result<Activity>> rxRes =.....
 .enableCorp(true)
                    .startByRxActivityResult();                
.startByRxActivityResult();


            rxRes.subscribe(result -> {
                Intent data = result.data();
                int resultCode = result.resultCode();
                // the requestCode using which the activity is started can be received here.
                List<String> paths = KKBMatisse.obtainPathResult(data);
                if (paths != null && !paths.isEmpty()) {
                    String picturePath = paths.get(0);
                    Log.e(TAG, "startByRxActivityResult: " + picturePath);
                    bridge.onCallback(picturePath);
                } else {
                    Log.e(TAG, "startByRxActivityResult: null");
                    bridge.onCallback("");

                }

            });

你会惊讶的发现少了REQUEST_CODE_CHOOSE 但是没有处理失败

rx用法也没有lin

  移动开发 最新文章
Vue3装载axios和element-ui
android adb cmd
【xcode】Xcode常用快捷键与技巧
Android开发中的线程池使用
Java 和 Android 的 Base64
Android 测试文字编码格式
微信小程序支付
安卓权限记录
知乎之自动养号
【Android Jetpack】DataStore
上一篇文章      下一篇文章      查看所有文章
加:2021-10-26 12:19:17  更:2021-10-26 12:21:18 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/24 0:50:24-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码