Java中ReactiveX(RxJava)的使用

article/2025/10/23 12:19:27

1.1 ReactiveX概述

ReactiveX官网:ReactiveX

1.1.1 Android的MVP开发模式

MVP的工作流程

  • Presenter负责逻辑的处理
  • Model提供数据
  • View负责显示

作为一种新的模式,在MVP中View并不直接使用Model,它们之间的通信是通过Presenter来进行的,所有的交互都发生在Presenter内部,而在MVC中View会从直接Model中读取数据而不是通过 Controller。

1.1.2 ReactiveX简介

RX(ReactiveX)<==> 反应式 <==> 响应式编程思维

什么是响应式编程:根据上一层的响应来影响下一层的变化

1.1.3 为什么要学习ReactiveX

  • 改变思维(响应式编程思维),编程效率提升

1.2  RxJava使用

RxJava地址:ReactiveX/RxJava (github.com)

RxAndroid地址:ReactiveX/RxAndroid (github.com)

1.2.1 RxJava的使用步骤

  1. 引入RxJava

    implementation 'io.reactivex.rxjava3:rxandroid:3.0.0'
    implementation 'io.reactivex.rxjava3:rxjava:3.1.4'
  2. 创建 Observer(被观察者对象)

    //Observable部分,被观察者部分
    Observable<String> myObservable=Observable.create(new Observable.OnSubscribe<String>() {@Overridepublic void call(Subscriber<? super String> subscriber) {subscriber.onNext("我是被观察的对象");subscriber.onCompleted();}
    });
  3. 创建Subscriber(理解为观察者对象)

    //Subscriber部分,观察者部分
    Subscriber<String> mySubscriber=new Subscriber<String>() {@Overridepublic void onCompleted() {}@Overridepublic void onError(Throwable e) {}@Overridepublic void onNext(String s) {System.out.println("接收到‘"+s+"’");;}
    };
  4. Observer和Subscriber关联

     myObservable.subscribe(mySubscriber);

1.2.2 使用RxJava加载图片

activity_main.xml代码

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"xmlns:tools="http://schemas.android.com/tools"android:layout_width="match_parent"android:layout_height="match_parent"android:orientation="vertical"tools:context=".MainActivity"><Buttonandroid:id="@+id/btn_showImage"android:layout_width="wrap_content"android:layout_height="wrap_content"android:text="图片显示加载" /><ImageViewandroid:id="@+id/iv_image"android:layout_width="match_parent"android:layout_height="wrap_content"/>
</LinearLayout>

MainActivity.java代码

package com.example.myrxjava;import androidx.appcompat.app.AppCompatActivity;import android.app.ProgressDialog;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.ImageView;import java.io.InputStream;
import java.net.HttpURLConnection;
import java.net.URL;import io.reactivex.rxjava3.android.schedulers.AndroidSchedulers;
import io.reactivex.rxjava3.annotations.NonNull;
import io.reactivex.rxjava3.core.Observable;
import io.reactivex.rxjava3.core.Observer;
import io.reactivex.rxjava3.disposables.Disposable;
import io.reactivex.rxjava3.functions.Function;
import io.reactivex.rxjava3.schedulers.Schedulers;public class MainActivity extends AppCompatActivity implements View.OnClickListener {private Button btn_showImage;private ImageView iv_image;private final String PATH = "https://scpic.chinaz.net/files/pic/pic9/201312/apic2597.jpg";private ProgressDialog progressDialog;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);btn_showImage = findViewById(R.id.btn_showImage);iv_image = findViewById(R.id.iv_image);btn_showImage.setOnClickListener(this);}@Overridepublic void onClick(View view) {switch (view.getId()){case R.id.btn_showImage:showImageAction(view);break;}}public void showImageAction(View view){//RX系列框架为什么把所有函数都称为操作符:因为我们的函数要去操作从起点流向终点的过程//观察者模式:被观察者Observable ==> 观察者Observer//起点Observable.just(PATH) //第二步,分发将请求地址的字符串.map(new Function<String, Bitmap>() { //第三步,转换为图片给下一层@Overridepublic Bitmap apply(String path) throws Throwable {Thread.sleep(3000); //模拟网络延迟URL url = new URL(path);HttpURLConnection httpURLConnection = (HttpURLConnection) url.openConnection();httpURLConnection.setConnectTimeout(5000); //设置请求超时时长int responseCode = httpURLConnection.getResponseCode();if (responseCode == HttpURLConnection.HTTP_OK){InputStream inputStream = httpURLConnection.getInputStream();Bitmap bitmap = BitmapFactory.decodeStream(inputStream);return bitmap;}return null;}}).subscribeOn(Schedulers.io()) //改变调用它之前代码的线程。分配请求异步线程.observeOn(AndroidSchedulers.mainThread()) //改变调用它之后代码的线程。给终点分配主线程.subscribe(new Observer<Bitmap>() { //订阅(关联)@Overridepublic void onSubscribe(@NonNull Disposable d) { //第一步,订阅成功,显示加载框progressDialog = new ProgressDialog(MainActivity.this);progressDialog.setTitle("图片加载中...");progressDialog.show();}@Overridepublic void onNext(@NonNull Bitmap bitmap) { //第四步,处理上一层返回的响应iv_image.setImageBitmap(bitmap);}@Overridepublic void onError(@NonNull Throwable e) { //业务流程链发生异常e.printStackTrace();}@Overridepublic void onComplete() { //第五步,业务流程链全部结束if (progressDialog != null) {progressDialog.dismiss();}}});}
}

运行效果图

1.2.3 在1.2.2的基础上添加操作

drawTextToBitmap()是一个自定义的为图片添加水印的方法 

1.2.4 在1.2.3的基础上添加打印日志

总结:可以在起点和终点之间任意添加各种操作/需求

1.2.5 使用Rx思维遍历数组

代码:

    private void action() {String[] strings = {"AAA", "BBB", "CCC", "DDD"};Observable.fromArray(strings).subscribe(new Consumer<String>() {@Overridepublic void accept(String s) throws Throwable {Log.e(TAG, "accept: " + s);;}});}

运行效果:

1.2.6 使用Rx思维解决问题

问题描述:服务器成功返回给客服端的data数据一般是JavaBean数据。当服务器返回数据失败时,data数据就不一定是再是JavaBean,而是可能是null、0等不同的数据,故解析时就会出现异常,下面就使用Rx来解决此问题

步骤流程图: 

Step1:创建总Bean

    private SuccessBean data;private int code;private String message;

Step2:创建成功Bean(data类)

    private int id;private String name;

Step3:构建登录引擎起点

import com.example.myrxjava.login.bean.ResponseResult;
import com.example.myrxjava.login.bean.SuccessBean;import io.reactivex.rxjava3.core.Observable;public class LoginEngine {public static Observable<ResponseResult> login(String username, String password){ResponseResult responseResult = new ResponseResult();if ("zhumeng".equals(username) && "123456".equals(password)){SuccessBean successBean = new SuccessBean();successBean.setId(45678910);successBean.setName("zhumeng登录成功");responseResult.setData(successBean);responseResult.setCode(200);responseResult.setMessage("登录成功");} else {responseResult.setData(null);responseResult.setCode(404);responseResult.setMessage("登录失败");}return Observable.just(responseResult); //返回响应的起点}
}

Step4:创建中间处理对象Customobserver

import com.example.myrxjava.login.bean.ResponseResult;
import com.example.myrxjava.login.bean.SuccessBean;import io.reactivex.rxjava3.annotations.NonNull;
import io.reactivex.rxjava3.core.Observer;
import io.reactivex.rxjava3.disposables.Disposable;public abstract class CustomObserver implements Observer<ResponseResult> {public abstract void success(SuccessBean successBean);public abstract void error(String messge);@Overridepublic void onSubscribe(@NonNull Disposable d) {}@Overridepublic void onNext(@NonNull ResponseResult responseResult) {if (responseResult.getCode() == 200){success(responseResult.getData());} else {error(responseResult.getMessage() + ",请求失败,请检查日志");}}@Overridepublic void onError(@NonNull Throwable e) {error(e.getMessage() + ",请检查日志获取错误信息详情");}@Overridepublic void onComplete() {}
}

Step5:实现Rx思维的登录操作

    private void login(String username, String password) {LoginEngine.login(username, password).subscribe(new CustomObserver() {@Overridepublic void success(SuccessBean successBean) {Log.d(TAG, "success: 成功Bean详情为" + successBean.toString());}@Overridepublic void error(String messge) {Log.d(TAG, "error: 失败的Message信息为" + messge);}});}

Step6:运行效果


http://chatgpt.dhexx.cn/article/WLaAfUUL.shtml

相关文章

ReactiveX-Observable

Observable &#xff08;此篇文章翻译自ReactiveX的官方文档) 在ReactiveX中&#xff0c;Observer&#xff08;观察者&#xff09;订阅了一个Observable&#xff08;观察对象&#xff09;。那么这个观察者会对观察对象发生的任何单一的变化&#xff0c;或者是一连串的变化做出…

ReactiveX 简介

Observable 在ReactiveX中&#xff0c;观察者订阅了一个Observable。然后&#xff0c;该观察者对Observable发出的任何项目或项目序列做出反应。 这种模式有利于并发操作&#xff0c;因为它不需要在等待Observable发出对象时阻塞&#xff0c;而是以观察者的形式创建一个哨兵&…

ReactiveX简介

一、ReactiveX简介 在学习RxJava前首先需要了解ReactiveX&#xff0c;因为RxJava是ReactiveX的一种Java的实现形式。 ReactiveX的官网地址为&#xff1a; http://reactivex.io/ReactiveX官网对于自身的介绍是&#xff1a; An API for asynchronous programming with observa…

搭建物联网服务器(一):购买阿里云服务器

一、购买阿里云服务器 2019年双十一一起拼团抢购阿里云服务器&#xff0c;一年86元钱&#xff1b;打算做个物联网的服务器玩玩&#xff1b; 二、解决问题 阿里云经常出现连接中断&#xff0c;查出问题是服务器的保活机制影响链接&#xff0c;于是进行处理&#xff1b; 解决方…

物联网服务器协议命令,物联网使用HTTP协议传输数据

物联网设备使用HTTP协议传输数据也是一种常用的方式&#xff0c;而且HTTP协议是个很成熟的东西&#xff0c;在服务器上很容易部署。 HTTP协议并不是很复杂的东西。其处在互联网的应用层&#xff0c;因此这个协议只是规定了数据包的格式。具体的数据传递则是由TCP/IP来实现的。 …

物联网协议(设备到物联网服务)

物联网中的网络分为设备到设备的网络与设备到物联网服务的网络。其中&#xff0c;设备到物联网服务的网络通信协议有HTTP&#xff0c;Websocket&#xff0c;MQTT等。 HTTP协议 HTTP&#xff08;超文本传输协议&#xff09;是一个负责从万维网服务器获取超文本到本地浏览器的传…

物联网系统上位机源码,含服务器和客户端 物联网服务端程序

物联网系统上位机源码&#xff0c;含服务器和客户端 物联网服务端程序&#xff0c;可以接受市面上大多数透传数据的DTU登录&#xff0c;以及和DTU双向通讯 程序功能&#xff1a;能分组管理&#xff0c;不同的组别用户只可见自己组别的设备&#xff0c;设备和客户端登录掉线直观…

物联网python开发实践

文章目录 第1章 物联网邂逅python物联网组成架构发展现状典型应用使用python的理由python与网关/云平台 第2章 开启python之旅版本选择、搭建开发环境python语言介绍 第3章 python数据结构第4章 python高级特性第5章 物联网核心组件网络通信方案网络通信协议硬件物联网云平台 第…

物联网系统怎么部署服务器,如何搭建物联网云服务器

如何搭建物联网云服务器 内容精选 换一换 创建并登录弹性云服务器,请参见《弹性云服务器快速入门》中“购买弹性云服务器”和“登录弹性云服务器”。该弹性云服务器用于连接文档数据库实例,需要与待连接的实例处于同一虚拟私有云子网内。创建弹性云服务器时,要选择操作系统,…

DGIOT物联网开源平台——腾讯云轻量应用服务器部署

为了节省开发者和实施工程师的时间&#xff0c;降低部署难度&#xff0c;本文提供了一套基于linux系统的一键式部署方式&#xff0c;以便快速交付&#xff0c;提升学习和商用部署的效率。 安装部署 1.服务器&#xff08;本案例采用腾讯云服务器作为示例&#xff09; 腾讯云地…

ubuntu系统下搭建本地物联网mqtt服务器的步骤

摘要&#xff1a;mqtt broker&#xff08;服务器&#xff09;是物联网通信的核心&#xff0c;网上有很多种开源的服务器可供选择&#xff0c;本文介绍如何在ubuntu系统下安装emqx服务器&#xff0c;让大家可以在局域网环境下搭建“云服务器”&#xff0c;体验物联网的乐趣。本文…

【物联网】12.物联网服务器发送方式(HTTP,WebSocket ,MQTT )

发送服务器的目的在于向设备发送数据并控制设备。 这篇主要是利用HTTP、WebSocket、MQTT 协议来看看如何实现同步和异步传输。 HTTP 发送数据 发送服务器等待接收HTTP 请求的Web 服务器。设备向这台服务器申请发送数据&#xff0c;作为响应&#xff0c;服务器把数据发给设备。…

轻量级高并发物联网服务器接收程序源码

轻量级高并发物联网服务器接收程序源码 &#xff08;仅仅是接收硬件数据程序 &#xff0c;没有web端&#xff0c;不是java&#xff0c;协议自己写&#xff0c;如果问及这些问题统统不回复。&#xff09;&#xff0c;对接几万个设备没问题&#xff0c;数据库采用ef6sqlite&…

C#物联网平台服务器框架源码

C#物联网平台服务器框架源码。 这套带码是通过C#编写集成IOCP高性能高并发优势服务器服务源码。 带手机appdemo源码 具体具备功能如下&#xff1a; 1、具备EF6mssql数据库功能&#xff0c;可更改为MYSQL或SQLITe. 2、自带WEB API服务&#xff0c;抛弃IIS支持。 用户可以通…

成本360元的迷你物联网服务器有多香?

嗨&#xff0c;大家好&#xff0c;我们又见面了&#xff0c;前段时间比较忙&#xff0c;所以一直没更新。之前在自己的笔记本上搭建了blynk服务器和Domoticz服务器&#xff0c;但是一直开着笔记本插着电源对电池损害太大&#xff0c;也曾经在手机上安装了服务器&#xff0c;但是…

c#轻量级高并发物联网服务器接收程序源码

c#轻量级高并发物联网服务器接收程序源码&#xff08;仅仅是接收硬件数据程序&#xff0c;没有web端&#xff0c;不是java&#xff0c;协议自己写。 &#xff09;&#xff0c;对接几万个设备没问题&#xff0c;数据库采用ef6sqlite&#xff0c;可改efMySQL.该程序只是源码使用示…

基于ESP32搭建物联网服务器十三(自已搭建一个MQTT服务器)

在之前的文章中:ESP32搭建WEB服务器十二(使用MQTT协议与ESP32互动)_你的幻境的博客-CSDN博客 我们已经实现了ESP32通过MQTT协议连接到公共MQTT服务器上&#xff0c;但是公共服务器在稳定性或安全性上&#xff0c;很多时候无法保证。这时&#xff0c;我们除了可以购买比如: 阿…

阿里云搭建MQTT物联网服务器

一、MQTT简介 1、MQTT&#xff08;Message Queuing Telemetry Transport&#xff0c;消息队列遥测传输协议&#xff09;&#xff0c;是一种基于发布/订阅&#xff08;publish/subscribe&#xff09;模式的"轻量级"通讯协议&#xff0c;该协议构建于TCP/IP协议上&…

搭建一个物联网平台

搭建一个简单的物联网平台 之所以产生自己搭建平台的想法&#xff0c;是因为本来要使用 one* 平台完成一项作业&#xff0c;但是这个平台的官方文档写的太混乱了&#xff0c;有些地方写的有很简略&#xff0c;对我这种想要入门的小白来说不太友好&#xff0c;而且网上的第三方资…

物联网服务器搭建记录,心得

前言 在庞大的物联网世界中&#xff0c;自己拥有一台物联网服务器时多么一件美好的事。如同自己做的衣服更合身&#xff0c;自己搭建的物联网服务更灵活。 2022/3/9搭建服务 首次搭建了服务&#xff0c;但是感觉在安全方面是个很大的问题。每个设备都能连接&#xff0c;每个…