首页 > 编程语言 > 42. RxJava基本使用

42. RxJava基本使用

时间:2022-09-19 09:15:17浏览次数:68  
标签:基本 layout 42 rxjava3 io RxJava import android reactivex

42. RxJava基本使用

42.1 RX思维

为什么学习RxJava? → 改变思维(响应式编程思维),编程效率提升。

经典架构官方地址:https://github.com/ReactiveX/RxJava

在这里插入图片描述

Rx系列官网:https://reactivex.io/

在这里插入图片描述

RX → 反应式

42.2 什么是响应式编程?
RX → 反应式

reactive == 反应式 == 响应式编程思维

RX == 响应式编程思维

RX思维的学习 → 【一劳永逸】

【什么是响应式编程?】

(点击登录按钮)起点 和 终点(登录成功、失败)

细化: 起点 和 终点

(起点) 点击按钮登录 --------> 请求服务器 --------> 服务器响应 ----------> 解析响应的JSON数据(终点)【登录成功 或 登录失败】

→ →

问:什么是响应式编程?

答:根据上一层的响应 来 影响下一层的变化。

42.3 使用Rx思维RxJava下载图片
创建新项目

在这里插入图片描述

添加依赖

implementation 'io.reactivex.rxjava3:rxandroid:3.0.0'

    implementation "io.reactivex.rxjava3:rxjava:3.1.5"

在这里插入图片描述

同步

布局

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".MainActivity"
    android:orientation="vertical"
    >

    <ImageView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:id="@+id/image"
        />


    <Button
        android:id="@+id/button"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="图片显示加载功能"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent"
        android:onClick="showImageAction"
        />


</LinearLayout>


MainActivity.java

package com.dingjiaxiong.myrxjava;

import androidx.appcompat.app.AppCompatActivity;

import android.app.ProgressDialog;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
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.Consumer;
import io.reactivex.rxjava3.functions.Function;
import io.reactivex.rxjava3.schedulers.Schedulers;

public class MainActivity extends AppCompatActivity {

    // 打印logcat日志的标签
    private final String TAG = MainActivity.class.getSimpleName();

    // 网络图片的链接地址
    private final static String PATH = "http://pcsource.upupoo.com/theme/2000858833/previewFix.jpg";

    // 弹出加载框(正在加载中...)
    private ProgressDialog progressDialog;

    // ImageView控件,用来显示结果图像
    private ImageView image;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        image = findViewById(R.id.image);
    }

    /**
     * 图片显示加载功能
     *
     * @param view
     */
    public void showImageAction(View view) {

         //如果采用传统开发方式,后面的开发者接手前面开发者的代码,就很痛苦(弊端)
        /**
         * TODO RX思维
         *
         * 起点 和 终点
         *
         * RxJava RXJS RxXXX  RX系列框架 为什么把所有函数都成为操作符 因为我们的函数要去操作  从起点 流向 终点7
         *
         */


        // 起点
        Observable.just(PATH)


                // 需求:001 图片下载需求  PATH ---》 Bitmap
                .map(new Function<String, Bitmap>() {
                    @NonNull
                    @Override
                    public Bitmap apply(@NonNull String path) throws Exception {
                        try {
                            Thread.sleep(2000); // 睡眠2秒钟

                            URL url = new URL(path);
                            HttpURLConnection httpURLConnection = (HttpURLConnection) url.openConnection();
                            httpURLConnection.setConnectTimeout(5000); // 设置请求连接时长 5秒
                            int responseCode = httpURLConnection.getResponseCode(); // 才开始 request    拿到服务器的响应  200成功  404有问题 ...
                            if (responseCode == HttpURLConnection.HTTP_OK) {
                                InputStream inputStream = httpURLConnection.getInputStream();
                                Bitmap bitmap = BitmapFactory.decodeStream(inputStream);
                                return bitmap;
                            }
                        } catch (Exception e) {
                            e.printStackTrace();
                        }
                        return null;
                    }
                })

                // 给上面的分配异步线程(图片下载操作)
                .subscribeOn(Schedulers.io())


                // 终点分配 Android主线程
                .observeOn(AndroidSchedulers.mainThread())

                // 关联:观察者设计模式   关联 起点 和 终点  ==  订阅
                .subscribe(

                        // 终点
                        new Observer<Bitmap>() {

                            // 订阅成功
                            @Override
                            public void onSubscribe(Disposable d) {

                            }

                            // 上一层给我的响应
                            @Override
                            public void onNext(Bitmap bitmap) {
                                image.setImageBitmap(bitmap); // 显示到控件上
                            }

                            // 链条思维发生了异常
                            @Override
                            public void one rror(Throwable e) {

                            }

                            // 整个链条全部结束
                            @Override
                            public void onComplete() {
                            }
                        });

    }
}

配置网络权限

在这里插入图片描述

运行

报错了

在这里插入图片描述

开始谷歌

在这里插入图片描述

原来如此。

配置一下

1.在res文件夹下创建一个xml文件夹,然后创建一个network_security_config.xml文件,文件内容如下:

<?xml version="1.0" encoding="utf-8"?>
<network-security-config>
    <base-config cleartextTrafficPermitted="true" />
</network-security-config>

2.接着,在AndroidManifest.xml文件下的application标签增加以下属性:

<application
...
 android:networkSecurityConfig="@xml/network_security_config"
...
    />

3.在AndroidManifest.xml配置文件的标签中直接插入

    android:usesCleartextTraffic="true"

在这里插入图片描述

在这里插入图片描述

再次运行

在这里插入图片描述

增加加载框,显示【正在加载中】

在这里插入图片描述

在整个链条思维结束后,隐藏加载框

在这里插入图片描述

再次运行

在这里插入图片描述

奈斯。

标签:基本,layout,42,rxjava3,io,RxJava,import,android,reactivex
From: https://www.cnblogs.com/55zjc/p/16706568.html

相关文章

  • Node.js(一)基本node.js读取删除
    npminit-y(初始化项目)vartext2=require("./text2");//解构const{a:A,b:B}=require("./text2")console.log(A,B)console.log(text2.a);console.log(text2.b);......
  • 二进制部署k8s --containerd 之基本环境
    一,首先配置hosts文件   k8s-master-01192.168.56.101#master节点k8s-master-02192.168.56.102#master节点k8s-master-03192.168.56.106#master节点k8......
  • [Golang] GO 语言工作环境的基本概念
    1.GOPATH和GOROOT(环境变量)1.GOROOTgo编译器、标准库等安装的地方,所有我们写的代码其实都是文本文件而已,需要编译器等工具将其加工成可执行文件或者库文件才能使用,每......
  • Maven基本概念及使用
    Maven:项目构建工具Gradle:安卓领域据说未来会取代mavenAnt:淘汰 整个项目架构,source,resource,test,testresource依赖:导入的jar包可以对项目进行打包 属于apach......
  • SSM框架之Mybatis基本概念及使用方法
    SSMSpingMVC+Spring+Mybatis SpringMVC充当Servlet可以理解为SpringMVC是Spring的WEB支持Mybatis充当Dao层Sping充当一个润滑油的角色 MybatisPlus国内......
  • Windows fiarwall 启动失败(0x8007042c)重启防火墙
    1.请把下面代码保存为【Repair.bat】2.右键点击【以管理员身份运行】3.重启机器,看看效果4.同时按【Win+R】键,输入【services.msc】,在【服务】里,尝试启动Windows......
  • 我的Go并发之旅、02 基本并发原语
    注:本文所有函数名为中文名,并不符合代码规范,仅供读者理解参考。GoroutineGo程不是OS线程,也不是绿色线程(语言运行时管理的线程),而是更高级别的抽象,一种特殊的协程。是一种非......
  • jz42连续字数的最大和(动态规划,贪心)
    publicclasssolution{ publicintmaxOfSubarray(int[]array){   int[]dp=newint[array.length];   dp[0]=array[0];   intmax=array[0]; ......
  • CentOS基本配置
    软件更新:yumupgrade-y(-y:安装过程中的默认项选y)自动补全命令:yum-yinstallbash-completionWget下载软件的工具:yuminstall-ywget安装vim编辑工具:yuminstall-yvim-......
  • 2022-2023-1 20221424俞鸿若劼 《计算机基础与程序设计》 第三周学习总结
    作业信息班级链接:https://edu.cnblogs.com/campus/besti/2022-2023-1-CFAP作业要求:https://www.cnblogs.com/rocedu/p/9577842.html#JXJC学习目标:数字分类与计数法、位......