android RXJava2.0(一)

从零开始的RxJava2.0教程(一)基础 1. 为什么写这篇文章RxJava这些年越来越流行,而上月末(2016.10.29)发布了2.0正式版,但网上大部分关于RxJava的教程都是1.x的。关于2.0的教程基本是介绍1.x和2.x的区别,对于RxJava的老用户来说,自然看看和1.x的区别就大致会用了,但是对于新手来说,就不得不先学1.x。这样来说,学习成本就提高了,本身RxJava就不容易上手。为了让年轻的司机可以直接从2.0开始学习 阅读详情

原链接

作者:Season_zlc
链接:http://www.jianshu.com/p/464fa025229e
來源:简书
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

看了之后只是学习记录而已

要在Android中使用RxJava2, 先添加Gradle配置:

compile 'io.reactivex.rxjava2:rxjava:2.0.1'
compile 'io.reactivex.rxjava2:rxandroid:2.0.1'

正题

在开始学习之前,先来介绍点原理性的东西。

网上也有很多介绍RxJava原理的文章,通常这些文章都从观察者模式开始,先讲观察者,被观察者,订阅关系巴拉巴拉一大堆,说实话,当我第一次看到这些文章的时候已经被这些名词给绕晕了,用了很长的时间才理清楚它们之间的关系。可能是我太蠢了,境界不够,领会不到那么多高大上的名词.

今天我用两根水管代替观察者和被观察者, 试图用通俗易懂的话把它们的关系解释清楚, 在这里我将从事件流这个角度来说明RxJava的基本工作原理。

先假设有两根水管:

上面一根水管为事件产生的水管,叫它上游吧,下面一根水管为事件接收的水管叫它下游吧。

两根水管通过一定的方式连接起来,使得上游每产生一个事件,下游就能收到该事件。注意这里和官网的事件图是反过来的, 这里的事件发送的顺序是先1,后2,后3这样的顺序, 事件接收的顺序也是先1,后2,后3的顺序, 我觉得这样更符合我们普通人的思维, 简单明了.

这里的上游和下游就分别对应着 RxJava 中的 Observable 和 Observer,它们之间的连接就对应着 subscribe(),因此这个关系用 RxJava 来表示就是:

//创建一个上游 Observable:
        Observable<Integer> observable = Observable.create(new ObservableOnSubscribe<Integer>() {
            @Override
            public void subscribe(ObservableEmitter<Integer> emitter) throws Exception {
                emitter.onNext(1);
                emitter.onNext(2);
                emitter.onNext(3);
                emitter.onComplete();
            }
        });
        //创建一个下游 Observer
        Observer<Integer> observer = new Observer<Integer>() {
            @Override
            public void onSubscribe(Disposable d) {
                Log.d(TAG, "subscribe");
            }

            @Override
            public void onNext(Integer value) {
                Log.d(TAG, "" + value);
            }

            @Override
            public void onError(Throwable e) {
                Log.d(TAG, "error");
            }

            @Override
            public void onComplete() {
                Log.d(TAG, "complete");
            }
        };
        //建立连接
        observable.subscribe(observer);

结果:

08-12 10:08:43.142 19034-19034/com.abilix.learn.permissiondemo D/RxActivity: onSubscribe
08-12 10:08:43.142 19034-19034/com.abilix.learn.permissiondemo D/RxActivity: 1
08-12 10:08:43.142 19034-19034/com.abilix.learn.permissiondemo D/RxActivity: 2
08-12 10:08:43.142 19034-19034/com.abilix.learn.permissiondemo D/RxActivity: 3
08-12 10:08:43.142 19034-19034/com.abilix.learn.permissiondemo D/RxActivity: onComplete

注意: 只有当上游和下游建立连接之后, 上游才会开始发送事件. 也就是调用了subscribe() 方法之后才开始发送事件.

把这段代码连起来写就成了RxJava引以为傲的链式操作:

接下来解释一下其中两个陌生的玩意: ObservableEmitter 和 Disposable.

ObservableEmitter: Emitter是发射器的意思,那就很好猜了,这个就是用来发出事件的,它可以发出三种类型的事件,通过调用emitter的onNext(T value)、onComplete()和onError(Throwable error)就可以分别发出next事件、complete事件和error事件。

但是,请注意,并不意味着你可以随意乱七八糟发射事件,需要满足一定的规则:

  • 上游可以发送无限个onNext, 下游也可以接收无限个 onNext.
  • 当上游发送了一个 onComplete 后, 上游 onComplete 之后的事件将会继续发送, 而下游收到onComplete事件之后将不再继续接收事件.
  • 当上游发送了一个 onError 后, 上游 onError 之后的事件将继续发送, 而下游收到 onError 事件之后将不再继续接收事件.
  • 上游可以不发送 onComplete 或 onError .
  • 最为关键的是 onComplete 和 onError 必须唯一并且互斥, 即不能发多个 onComplete , 也不能发多个 onError, 也不能先发一个 onComplete , 然后再发一个 onError , 反之亦然

注: 关于onComplete和onError唯一并且互斥这一点, 是需要自行在代码中进行控制, 如果你的代码逻辑中违背了这个规则,* 并不一定会导致程序崩溃*. 比如发送多个onComplete是可以正常运行的, 依然是收到第一个onComplete就不再接收了, 但若是发送多个onError, 则收到第二个onError事件会导致程序会崩溃.

以上几个规则用示意图表示如下:

介绍了 ObservableEmitter, 接下来介绍 Disposable, 这个单词的字面意思是一次性用品,用完即可丢弃的. 那么在 RxJava 中怎么去理解它呢, 对应于上面的水管的例子, 我们可以把它理解成两根管道之间的一个机关, 当调用它的 dispose() 方法时, 它就会将两根管道切断, 从而导致下游收不到事件.

注意: 调用dispose()并不会导致上游不再继续发送事件, 上游会继续发送剩余的事件.

来看个例子, 我们让上游依次发送1,2,3,complete,4,在下游收到第二个事件之后, 切断水管, 看看运行结果:

Observable.create(new ObservableOnSubscribe<Integer>() {
            @Override
            public void subscribe(ObservableEmitter<Integer> emitter) throws Exception {
                Log.d(TAG, "emit 1");
                emitter.onNext(1);
                Log.d(TAG, "emit 2");
                emitter.onNext(2);
                Log.d(TAG, "emit 3");
                emitter.onNext(3);
                Log.d(TAG, "emit complete");
                emitter.onComplete();
                Log.d(TAG, "emit 4");
                emitter.onNext(4);
            }
        }).subscribe(new Observer<Integer>() {
            private Disposable mDisposable;
            private int i;

            @Override
            public void onSubscribe(Disposable d) {
                Log.d(TAG, "subscribe");
                mDisposable = d;
            }

            @Override
            public void onNext(Integer value) {
                Log.d(TAG, "onNext: " + value);
                i++;
                if (i == 2) {
                    Log.d(TAG, "dispose");
                    mDisposable.dispose();
                    Log.d(TAG, "isDisposed : " + mDisposable.isDisposed());
                }
            }

            @Override
            public void onError(Throwable e) {
                Log.d(TAG, "error");
            }

            @Override
            public void onComplete() {
                Log.d(TAG, "complete");
            }
        });

结果:

12-02 06:54:07.728 7404-7404/zlc.season.rxjava2demo D/TAG: subscribe
12-02 06:54:07.728 7404-7404/zlc.season.rxjava2demo D/TAG: emit 1
12-02 06:54:07.728 7404-7404/zlc.season.rxjava2demo D/TAG: onNext: 1
12-02 06:54:07.728 7404-7404/zlc.season.rxjava2demo D/TAG: emit 2
12-02 06:54:07.728 7404-7404/zlc.season.rxjava2demo D/TAG: onNext: 2
12-02 06:54:07.728 7404-7404/zlc.season.rxjava2demo D/TAG: dispose
12-02 06:54:07.728 7404-7404/zlc.season.rxjava2demo D/TAG: isDisposed : true
12-02 06:54:07.728 7404-7404/zlc.season.rxjava2demo D/TAG: emit 3
12-02 06:54:07.728 7404-7404/zlc.season.rxjava2demo D/TAG: emit complete
12-02 06:54:07.728 7404-7404/zlc.season.rxjava2demo D/TAG: emit 4

从运行结果我们看到, 在收到 onNext2 这个事件后, 切断了水管, 但是上游仍然发送了 3, complete, 4这几个事件, 而且上游并没有因为发送了 onComplete 而停止. 同时可以看到下游的onSubscribe() 方法是最先调用的.

即:

  1. 调用dispose()方法上游还会接着走
  2. 上游不会因为发送了onComplete而停止
  3. 下游中onSubscribe()方法是最先调用的

Disposable 的用处不止这些, 后面讲解到了线程的调度之后, 我们会发现它的重要性. 随着后续深入的讲解, 我们会在更多的地方发现它的身影.

另外, subscribe()有多个重载的方法:

public final Disposable subscribe() {}
    public final Disposable subscribe(Consumer<? super T> onNext) {}
    public final Disposable subscribe(Consumer<? super T> onNext, Consumer<? super Throwable> onError) {} 
    public final Disposable subscribe(Consumer<? super T> onNext, Consumer<? super Throwable> onError, Action onComplete) {}
    public final Disposable subscribe(Consumer<? super T> onNext, Consumer<? super Throwable> onError, Action onComplete, Consumer<? super Disposable> onSubscribe) {}
    public final void subscribe(Observer<? super T> observer) {}

最后一个带有Observer参数的我们已经使用过了,这里对其他几个方法进行说明.

  • 不带任何参数的 subscribe() 表示下游不关心任何事件,你上游尽管发你的数据去吧, 老子可不管你发什么.
  • 带有一个 Consumer 参数的方法表示下游只关心onNext事件, 其他的事件我假装没看见, 因此我们如果只需要 onNext 事件可以这么写:

    Observable.create(new ObservableOnSubscribe<Integer>() {
            @Override
            public void subscribe(ObservableEmitter<Integer> emitter) throws Exception {
                Log.d(TAG, "emit 1");
                emitter.onNext(1);
                Log.d(TAG, "emit 2");
                emitter.onNext(2);
                Log.d(TAG, "emit 3");
                emitter.onNext(3);
                Log.d(TAG, "emit complete");
                emitter.onComplete();
                Log.d(TAG, "emit 4");
                emitter.onNext(4);
            }
        }).subscribe(new Consumer<Integer>() {
            @Override
            public void accept(Integer integer) throws Exception {
                Log.d(TAG, "onNext: " + integer);
            }
        });
    

2017/8/12 11:18:58

自己总结

这个系列(一)今天学习了

  1. Observable
  2. Observer
  3. subscribe()
    1. 通常我们使用的是带(Observer)参数的subscribe(Observer)方法
    2. 不带任何参数的subscribe()方法代表上游随便发,下游收到算我输
    3. 带有一个Consumer的subscribe(Consumer)方法代表只接收onNext方法
    4. 剩下类推
  4. ObservableEmitter
  5. Disposable
    1. 调用dispose()方法上游还会接着走
    2. 上游不会因为发送了onComplete而停止
    3. 下游中onSubscribe()方法是最先调用的
  6. 发射规则:
    1. 上游可以发送无限个onNext, 下游也可以接收无限个 onNext.
    2. 当上游发送了一个 onComplete 后, 上游 onComplete 之后的事件将会继续发送, 而下游收到onComplete事件之后将不再继续接收事件.
    3. 当上游发送了一个 onError 后, 上游 onError 之后的事件将继续发送, 而下游收到 onError 事件之后将不再继续接收事件.
    4. 上游可以不发送 onComplete 或 onError .
    5. 最为关键的是 onComplete 和 onError 必须唯一并且互斥, 即不能发多个 onComplete , 也不能发多个 onError, 也不能先发一个 onComplete , 然后再发一个 onError , 反之亦然
为 ABAP BSP 与 ICF 量身打造的错误页实践:从 CX_ROOT 到 SICF 的端到端落地指南 摘要 本文系统讲解SAP ABAP平台中BSP与ICF层的错误页定制方法。在BSP层,通过标记错误页属性和绑定ERROR_OBJECT异常对象,实现友好的错误展示与日志记录。ICF层通过SICF事务码统一配置错误页、登录与登出逻辑,支持服务树继承。文章包含可直接落地的代码示例,并针对现代Fiori架构给出演进建议,帮助开发者提升用户体验与系统安全性。 阅读详情

相关推荐

VGA系列之一:VGA显示网络图片

VGA系列之一:VGA显示网络图片VGA系列之一VGA显示网络图片 1 如何用FPGA实现VGA显示 2 网络图片和VGA显示有何区别 3VGA如何显示图片

善良の一休君的博客 1万+

解决:使用 rxandroid jar 包出现“java.lang.NoClassDefFoundError:io.reactivex.Flowable”的异常问题

最近要在 使用RxJava2,因为要使用 aar 包,但导入的在线包又太多,所以使用 jar 包方式 ,在导入RxJava 2.0.1 和RxAndroid 2.0.1的jar包后, 使用subscribeOn和observOn的切换线程的时候,没法使用。 错误信息: FATAL EXCEPTION:main Process: com.xxx.xxxx, PID: 12345 j...

q610098308的专栏 3111

NT35310 LCD屏的初始化与图形显示实战:从画点到UI设计的完整指南

本文详细介绍了NT35310 LCD屏的初始化与图形显示实战,从硬件配置到UI设计全流程。内容包括8080总线连接、初始化序列、基础图形绘制算法、显示优化技巧以及UI框架实现,帮助开发者快速掌握TFT-LCD驱动开发技术,适用于工业控制和智能家居等嵌入式应用场景。

table的专栏 370

android--RXJava详细使用篇

人性的背后是白云苍狗,愿我们都能做生活的高手

袁震的博客 4554

YOLOv8魔改网络后训练全零?别慌,关掉AMP混合精度训练试试

本文探讨了YOLOv8魔改网络后训练出现全零指标的问题,指出AMP混合精度训练与自定义网络结构的不兼容性。通过分析梯度消失现象和AMP工作原理,提供了关闭AMP、调整学习率等解决方案,并建议预防性开发实践以避免类似问题。

weixin_28338005的博客 321

RTC 实时时钟实验

如果在 RTC_CR 寄存器中设置了相应的允许位,则在每个TR_CLK 周期中 RTC 产生一个中断(秒中断)。void BKP_WriteBackupRegister(uint16_t BKP_DR, uint16_t Data) // 往备份区域写用户数据的函数 (这个函数的第一个参数就是寄存器的标号了,这个是通过宏定义定义的)存储在 RTC_ALR 寄存器中的可编程时间相比较,如果 RTC_CR 控制寄存器中设置了相应允许位,比较匹配时将产生一个闹钟中断。寄存器操作完成,并同步之后,设置秒钟中断。

m0_55996456的博客 1205

给 Android 开发者的 RxJava 详解

前言 我从去年开始使用 RxJava ,到现在一年多了。今年加入了 Flipboard 后,看到 Flipboard 的 Android 项目也在使用 RxJava ,并且使用的场景越来越多 。而最近这几个月,我也发现国内越来越多的人开始提及 RxJava 。有人说『RxJava 真是太好用了』,有人说『RxJava 真是太难用了』,另外更多的人表示:我真的百度了也谷歌了,但我还是想问: RxJava 到底是什么? 鉴于 RxJava 目前这种既火爆又神秘的现状,而我又在一年的使用过程中对 RxJa..

青岛海珊瑚IT学习中心 3376

研发工作量科学量化评估模型:从多维系数到等级落地指南

摘要:本文提出了一套基于多维系数的科学量化评估模型,用于精准评估软件开发工作量。该模型从需求复杂度、技术难度、质量要求和依赖风险四个核心维度进行量化评估,通过系数乘积计算综合工作量。文章详细说明了各维度的系数区间划分标准,并演示了从基础工作量估算到综合系数计算的具体步骤。该模型通过结构化评估过程,将主观经验转化为客观量化指标,帮助团队提高工作量评估的准确性,增强项目交付的可预测性。其价值在于使评估过程透明化、结构化和可追溯,从而减少项目延期风险,优化资源规划。

友莘居士的博客 1678

android——rxjava的使用(连续多个弹窗的处理)

本文介绍项目开发中使用到rxjava的情形,以及详细的代码。RxJava是一个基于Java语言的Reactive Extensions库,它用于实现异步编程和流式处理,通过将事件和数据流以数据序列的形式进行处理,提高了代码的可读性和可维护性。

wy313622821的博客 3542

村田电感模型选型指南:.s2p和SPICE netlist在ADS中的表现差异

本文深度解析了村田电感在ADS仿真中.s2p与SPICE netlist两种模型的表现差异。通过对比模型本质、仿真设置及高低频段精度,揭示了.s2p文件基于实测插值而SPICE netlist基于等效电路外推的特性。文章提供了明确的选型策略,帮助工程师根据项目频段、仿真类型和精度需求,在射频与微波电路设计中做出最优模型选择。

k9l0m1的博客 451

芒果YOLO11改进17:即插即用 | 损失函数Repulsion Loss|Repulsion 解决目标遮挡场景下的目标检测,为解决密集人群检测中遮挡设计的损失函数,打造高效

即插即用 | 损失函数Repulsion Loss|Repulsion 解决目标遮挡场景下的目标检测,为解决密集人群检测中遮挡设计的损失函数,打造高效

包括YOLOv5、YOLOv7、YOLOv8等模型改进 482

《给 Android 开发者的 RxJava 详解》笔记

这篇文章是看扔物线的《给 Android 开发者的 RxJava 详解》的笔记,在此仅仅做一个笔记,以便日后查用。RxJava的优势 异步(RxJava本质上是一个实现异步操作的库) 简洁(随着程序逻辑变得越来越复杂,它依然能够保持简洁) API 介绍和原理简析RxJava的观察者模式 RxJava 有四个基本概念:Observable (可观察者,即被观察者)、 Observer (观察者)、

linxi7的博客 731

【学习系列】SAP RAP 3:添加多层级的子节点

本文详细介绍了在SAP ABAP RAP开发中如何创建多层级业务对象。主要内容包括:1)创建明细和计划行层级的数据库表及CDS视图;2)使用association和composition关键字建立父子关联关系;3)创建各层级的投影视图并设置层级关系;4)更新行为定义,添加关联、操作权限等控制;5)更新服务定义公开新增视图;6)创建元数据扩展优化UI展示。通过这一系列步骤,实现了从抬头到明细再到计划行的完整业务对象层级结构,为后续UI功能扩展奠定了基础。

DeveloperMrMeng的博客 587

【Android -- RxJava】RxJava2.0 教程(一),入门

提升开发效率,降低维护成本一直是开发团队永恒不变的宗旨。近两年来国内的技术圈子中越来越多的开始提及 ,越来越多的应用和面试中都会有 ,而就目前的情况,Android 的网络库基本被 一统天下了,而配合上响应式编程 可谓如鱼得水。...

Kevin Learn Android 2309

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

android 从Rxjava2.0到Retrofit (一)

android 从Rxjava2.0到Retrofit

RingoPaul的博客 1325

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

Android RxJava2.0初学者教程(一)

前言 我先回答这个问题:学习RxJava2需要先学习RxJava1吗? 答案明显不是,如果你以前学过RxJava1,那么对于RxJava2只需要看看更新了哪些东西就行了,其最核心的思想并没有变化,如果你没学过RxJava1,没有关系,直接学习RxJava2。所以作为一个RxJava2的教程,本文中所有的名词都属于RxJava2中,并不涉及RxJava1。 要在Android中使用RxJava...

残风乱了温柔的博客 225

华为的C语言编程规范.pdf

华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。

【Android -- RxJava】RxJava2.0 实践(一),后台执行耗时操作,实时通知 UI 更新

本文介绍如何使用 subscribeOn/observeOn 来实现后台执行耗时任务,并通知主线程更新进度。

Kevin Learn Android 1472

android rxbus2.0封装,【Android架构】基于MVP模式的Retrofit2+RXjava封装(一)

一 、首先是依赖compile'com.google.code.gson:gson:2.8.0'compile'com.squareup.okhttp3:okhttp:3.4.1'compile'com.yanzhenjie:permission:1.0.5'compile'com.squareup.retrofit2:retrofit:2.3.0'compile'io.reactive...

weixin_42377538的博客 232

RxJava2 / RxAndroid2操作符interval:每隔若干时间发射信号

RxJava2 / RxAndroid2操作符interval:每隔若干时间发射信号Interval每隔一定时间发射一个整数,从0开始,例如:package zhangphil.app; import android.os.Bundle; import android.support.annotation.Nullable; import android.support.v7.app.AppCo

Zhang Phil 1万+

Android RxAndroid与RxJava之intervalRange

intervalRange以一个例子说明:从1开始输出10个数据,延迟0秒执行,每隔2秒执行一次: package zhangphil.app; import android.app.Activity; import android.os.Bundle; import android....

chuoshao2508的博客 222

android 第三方banner,Android 常用第三方框架 自我整理

banner 图https://github.com/zhpanvip/BannerViewPager/tree/master目前最新版本 2.4.2https://jitpack.io/#zhpanvip/BannerViewPagerimplementation 'com.zhpan.library:bannerview:latestVersion'支持一屏三页,自定义样式,Indicato...

weixin_39944074的博客 302

Android RxJava第一弹之原理详解、使用详解、常用场景(基于Rxjava2.0)

Android RxJava第一弹之原理详解、使用详解、常用场景(基于Rxjava2.0) Android RxJava第二弹之RxJava封装库 RxJava+Animation RxJava+Glide Android RxJava第三弹之RxJava2.0尝鲜本人参考以下文章给 Android 开发者的 RxJava 详解—扔物线Rxjava 2.0 与 Rxjava 1.0有什么不同

qq_28195645的博客 9425

Android Retrofit2.0+RxJava3.0 基本使用

异常: Could not locate call adapter for io.reactivex.Observable<okhttp3.ResponseBody>. compile 'com.squareup.retrofit2:adapter-rxjava:2.1.0' RxJava适配器是1.0 所以换成RxJava2.0就可以了,两种方式配置RxJava适配器2.0 1,第三方的提供的适配器2.0 compile 'com.jakewharton.retrofit:retro

ezconn的博客 9705

从零开始的RxJava2.0教程(四)在安卓中的应用

1. 前言在第1 2 3篇中,我介绍了RxJava 2.0的基本用法。这一篇将介绍在安卓中的基本用法。 附上本系列教程的链接。 从零开始的RxJava2.0教程(一)基础 从零开始的RxJava2.0教程(二)操作符 从零开始的RxJava2.0教程(三)响应式的好处2. RxAndroidRxAndroid是RxJava针对Android平台的扩展库。曾几何时,RxAndroid确实提供了

宇不语的博客 1万+

RxJava2最全面、最详细的讲解(一)

一、概述 提高开发效果,降低维护成本一直是团队追求的宗旨。现在安卓里面RxJava2+Retrofit+OKHttp的网络请求框架是最流行的,几乎一统江湖,配合响应式式编程的RxJava使用也越来越多。如果英文比较好而且有兴趣的可以到官网学习:ReactiveX的官方网站。(源码和其他相关链接在文章最后给出) RxJava到底是什么?       RxJava在Git...

qq_32534441的博客 9529

基于Retrofit2.0+RxJava+Dragger2实现不一样的Android网络构架搭建

我们很多开发者大都在小型公司,不了解大公司是怎么做Android网络框架的,也想知道那些用户量过千万的APP到底用了些什么技术,让我们一起来了解一下Android版的美团和Uber到底用了些什么技术。 今天我们就来讲讲怎么用Retrofit2.0+RxJava+Dragger2来实现Android网络构架搭建,给大家提供一种思路,供大家参考参考。

做更好的自己 1万+
上一篇: android ApplicationId 与 PackageName
下一篇: android图形动画
missingcall
博客等级 码龄10年 8粉丝 40原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值