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