文章

Rx

Rx

Rxjava

  • 添加依赖
1
2
implementation 'io.rectivex.rxjava2:rxandroid:2.0.1'
implementation 'io.rectivex.rxjava2:rxjava:2.0.7'

Rx思维下载图片

  • 添加网络权限
1
<uses-permission android:name="android.permission.INTERNET"/>
  • activity_main.xml
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    xmlns:android="http://schemas.android.com/apk/res/android">

    <ImageView
        android:layout_width="100dp"
        android:layout_height="100dp"
        android:id="@+id/iv"/>

    <Button
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="显示图片下载"
        android:onClick="showImageAction"/>

    <Button
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="常用操作符"
        android:onClick="action"/>

</LinearLayout>
  • MainActivity.java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
package com.example.rxjava;

import androidx.appcompat.app.AppCompatActivity;

import android.annotation.SuppressLint;
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 android.widget.ProgressBar;

import java.io.InputStream;
import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.URL;

import io.reactivex.Observable;
import io.reactivex.Observer;
import io.reactivex.Scheduler;
import io.reactivex.android.schedulers.AndroidSchedulers;
import io.reactivex.disposables.Disposable;
import io.reactivex.functions.Consumer;
import io.reactivex.functions.Function;
import io.reactivex.schedulers.Schedulers;

public class MainActivity extends AppCompatActivity {

    // 网络图片地址
    private final static String PATH = "https://i1.hdslb.com/bfs/face/2eac165893715bfa5a35f76a0f94e5a3a99c16d1.jpg@160w_160h_1c.webp";

    // 弹出加载框
    private ProgressDialog progressDialog;

    private ImageView imageView;

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

        imageView = findViewById(R.id.iv);
    }

    public void showImageAction(View view) {
        // TODO 第二步
        // 起点
        Observable.just(PATH)

                // TODO 第三步
                // 需求001:下载图片
                .map(new Function<String, Bitmap>() {
                    @Override
                    public Bitmap apply(String s) throws Exception {
                        try {
                            URL url = new URL(s);
                            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;
                            }
                        } catch (MalformedURLException e) {
                            e.printStackTrace();
                        } finally {
                        }
                        return null;
                    }
                })

                // 需求002:加水印
                .map(new Function<Bitmap, Bitmap>() {
                    @Override
                    public Bitmap apply(Bitmap bitmap) throws Exception {
                        Paint paint = new Paint();
                        paint.setColor(Color.RED);
                        paint.setTextSize(80);
                        Bitmap bitmap1 = drawTextToBitmap(bitmap, "哈哈", paint, 80, 80);
                        return bitmap1;
                    }
                })

                // 需求003:......

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

                // 给下面的UI分配安卓主线程
                .observeOn(AndroidSchedulers.mainThread())

                // 订阅:观察者模式 关联起点和终点
                .subscribe(
                        // 终点
                        new Observer<Bitmap>() {
                    // TODO 第一步
                    // 订阅成功
                    @Override
                    public void onSubscribe(Disposable d) {
                        // 加载框
                        progressDialog = new ProgressDialog(MainActivity.this);
                        progressDialog.setTitle("正在加载图片");
                        progressDialog.show();
                    }

                    // TODO 第四步
                    // 上一层的响应
                    @Override
                    public void onNext(Bitmap bitmap) {
                        imageView.setImageBitmap(bitmap);
                    }

                    // 链条发送异常
                    @Override
                    public void onError(Throwable e) {

                    }

                    // TODO 第五步
                    // 链条全部结束
                    @Override
                    public void onComplete() {
                        progressDialog.dismiss();
                    }
                });

    }

    @SuppressLint("CheckResult")
    public void action(View view) {
        String[] strings = {"aaa", "bbb", "ccc"};
        Observable.fromArray(strings)
                .subscribe(new Consumer<String>() {
                    @Override
                    public void accept(String s) throws Exception {
                        Log.d("xxx", "accept: " + s);
                    }
                });

    }

    private final Bitmap drawTextToBitmap(Bitmap bitmap, String text, Paint paint, int paddingLeft, int paddingTop){
        Bitmap.Config bitmapConfig = bitmap.getConfig();

        paint.setDither(true); // 获取清晰的图片采样
        paint.setFilterBitmap(true); // 过滤一些
        if(bitmapConfig == null){
            bitmapConfig = Bitmap.Config.ARGB_8888;
        }
        bitmap = bitmap.copy(bitmapConfig, true);
        Canvas canvas = new Canvas(bitmap);

        canvas.drawText(text, paddingLeft, paddingTop, paint);
        return bitmap;
    }
}

解决服务器响应问题

  • SuccessBean
1
2
private int id;
private String name;
  • ResponseResult
1
2
3
private SuccessBean data;
private int code;
private String message;
  • CustomObserver.java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
package com.example.rxjava2;

import io.reactivex.Observer;
import io.reactivex.disposables.Disposable;

public abstract class CustomObserver implements Observer<ResponseResult> {

    public abstract void success(SuccessBean successBean);
    public abstract void error(String message);

    @Override
    public void onSubscribe(Disposable d) {

    }

    @Override
    public void onNext(ResponseResult responseResult) {
        if(responseResult.getData() == null){
            error(responseResult.getMessage() + "请求失败");
        }else{
            success(responseResult.getData());
        }
    }

    @Override
    public void onError(Throwable e) {
        error(e.getMessage() + "错误详情");
    }

    @Override
    public void onComplete() {

    }
}
  • LoginEngine.java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
package com.example.rxjava2;

import io.reactivex.Observable;

public class LoginEngine {

    public static Observable<ResponseResult> login(String name, String pwd){
        ResponseResult responseResult = new ResponseResult();
        if("xxx".equals(name) && "666".equals(pwd)){
            // 成功Bean
            SuccessBean successBean = new SuccessBean();
            successBean.setId(11111);
            successBean.setName("xxx登录成功");

            responseResult.setData(successBean);
            responseResult.setCode(200);
            responseResult.setMessage("登录成功");
        }else{
            responseResult.setData(null);
            responseResult.setCode(404);
            responseResult.setMessage("登录失败");
        }

        // 返回被观察者
        return Observable.just(responseResult);
    }
}
  • MainActivity.java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
package com.example.rxjava2;

import androidx.appcompat.app.AppCompatActivity;

import android.os.Bundle;
import android.util.Log;

public class MainActivity extends AppCompatActivity {

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

        LoginEngine.login("xxx", "666")
                .subscribe(new CustomObserver() {
                    @Override
                    public void success(SuccessBean successBean) {
                        Log.d("xxx", "成功bean:" + successBean.toString());
                    }

                    @Override
                    public void error(String message) {
                        Log.d("xxx", "错误信息: " + message);
                    }
                });
    }
}
本文由作者按照 CC BY 4.0 进行授权