Skip to content

Commit 8ea7dc2

Browse files
committed
14 . 增加了两个readme文件;连载小说和读者;一个复杂一些的应用场景。
1 parent 77a0a72 commit 8ea7dc2

File tree

14 files changed

+165
-2
lines changed

14 files changed

+165
-2
lines changed

app/src/main/java/com/liuh/learn/rxjava2/MainActivity.java

+114-2
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,12 @@
11
package com.liuh.learn.rxjava2;
22

33
import android.content.Intent;
4+
import android.graphics.Bitmap;
5+
import android.graphics.drawable.BitmapDrawable;
6+
import android.graphics.drawable.Drawable;
47
import android.support.v7.app.AppCompatActivity;
58
import android.os.Bundle;
9+
import android.util.Log;
610
import android.view.View;
711

812
import com.liuh.learn.rxjava2.usecase.RxCaseConcatActivity;
@@ -16,6 +20,16 @@
1620

1721
import butterknife.ButterKnife;
1822
import butterknife.OnClick;
23+
import io.reactivex.Observable;
24+
import io.reactivex.ObservableEmitter;
25+
import io.reactivex.ObservableOnSubscribe;
26+
import io.reactivex.Observer;
27+
import io.reactivex.android.schedulers.AndroidSchedulers;
28+
import io.reactivex.disposables.Disposable;
29+
import io.reactivex.functions.Consumer;
30+
import io.reactivex.schedulers.Schedulers;
31+
32+
import static java.lang.Thread.sleep;
1933

2034
public class MainActivity extends AppCompatActivity {
2135

@@ -28,7 +42,8 @@ protected void onCreate(Bundle savedInstanceState) {
2842

2943
@OnClick({R.id.btn_rx_operators, R.id.btn_a_simple_http_request, R.id.btn_http_request_concat,
3044
R.id.btn_http_request_flatmap, R.id.btn_http_request_zip, R.id.btn_http_request_interval,
31-
R.id.btn_http_request_debounce, R.id.btn_thread_scheduler})
45+
R.id.btn_http_request_debounce, R.id.btn_thread_scheduler, R.id.btn_novel_reader,
46+
R.id.btn_complex_use})
3247
void onViewClicked(View view) {
3348
switch (view.getId()) {
3449
case R.id.btn_rx_operators:
@@ -55,7 +70,104 @@ void onViewClicked(View view) {
5570
case R.id.btn_thread_scheduler:
5671
startActivity(new Intent(this, RxCaseThreadSchedulerActivity.class));
5772
break;
58-
73+
case R.id.btn_novel_reader:
74+
novelAndReader();
75+
break;
76+
case R.id.btn_complex_use:
77+
oneComplexUse();
78+
break;
5979
}
6080
}
81+
82+
/**
83+
* 观察者模式(连载小说和读者)
84+
*/
85+
private void novelAndReader() {
86+
Observable.create(new ObservableOnSubscribe<String>() {
87+
@Override
88+
public void subscribe(ObservableEmitter<String> emitter) throws Exception {
89+
emitter.onNext("连载1");
90+
sleep(3000);
91+
emitter.onNext("连载2");
92+
emitter.onNext("连载3");
93+
94+
}
95+
}).subscribeOn(Schedulers.io())
96+
.observeOn(AndroidSchedulers.mainThread())
97+
.subscribe(new Observer<String>() {
98+
@Override
99+
public void onSubscribe(Disposable d) {
100+
101+
}
102+
103+
@Override
104+
public void onNext(String s) {
105+
Log.e("-----", "Observer : onNext : " + s);
106+
}
107+
108+
@Override
109+
public void onError(Throwable e) {
110+
Log.e("-----", "Observer : onError");
111+
}
112+
113+
@Override
114+
public void onComplete() {
115+
Log.e("-----", "Observer : onComplete");
116+
}
117+
});
118+
}
119+
120+
121+
private int[] drawables = {R.drawable.icon_1, R.drawable.icon_2, R.drawable.icon_3, R.drawable.icon_4, R.drawable.icon_5,
122+
R.drawable.icon_6, R.drawable.icon_7, R.drawable.icon_8, R.drawable.icon_9, R.drawable.icon_10};
123+
124+
/**
125+
* 一个复杂一点的应用场景
126+
*/
127+
private void oneComplexUse() {
128+
129+
Observable.create(new ObservableOnSubscribe<Drawable>() {
130+
@Override
131+
public void subscribe(ObservableEmitter<Drawable> emitter) throws Exception {
132+
for (int i = 0; i < drawables.length; i++) {
133+
Drawable drawable = getResources().getDrawable(drawables[i]);
134+
135+
// 第六张图片延时3秒后加载
136+
if (5 == i) {
137+
sleep(3000);
138+
}
139+
140+
// 复制第七张图片到sd卡
141+
if (6 == i) {
142+
Bitmap bitmap = ((BitmapDrawable) drawable).getBitmap();
143+
saveBitmap(bitmap, "test.png", Bitmap.CompressFormat.PNG);
144+
}
145+
146+
// 上传到网络
147+
if (7 == i) {
148+
uploadIcon(drawable);
149+
}
150+
emitter.onNext(drawable);
151+
}
152+
emitter.onComplete();
153+
}
154+
}).subscribeOn(Schedulers.io())
155+
.subscribeOn(AndroidSchedulers.mainThread())
156+
.subscribe(new Consumer<Drawable>() {
157+
@Override
158+
public void accept(Drawable drawable) throws Exception {
159+
// 回调后在UI界面上展示出来
160+
161+
}
162+
});
163+
164+
}
165+
166+
private void saveBitmap(Bitmap bitmap, String s, Bitmap.CompressFormat png) {
167+
168+
}
169+
170+
private void uploadIcon(Drawable drawable) {
171+
172+
}
61173
}
2.96 KB
Loading
2.81 KB
Loading
4.37 KB
Loading
3.94 KB
Loading
5.48 KB
Loading
3.46 KB
Loading
3.72 KB
Loading
1.79 KB
Loading
5.23 KB
Loading
3.59 KB
Loading

app/src/main/res/layout/activity_main2.xml

+17
Original file line numberDiff line numberDiff line change
@@ -56,4 +56,21 @@
5656
android:layout_height="wrap_content"
5757
android:text="线程调度" />
5858

59+
<View
60+
android:layout_width="match_parent"
61+
android:layout_height="1dp"
62+
android:background="@android:color/holo_blue_light" />
63+
64+
<Button
65+
android:id="@+id/btn_novel_reader"
66+
android:layout_width="match_parent"
67+
android:layout_height="wrap_content"
68+
android:text="连载小说和读者" />
69+
70+
<Button
71+
android:id="@+id/btn_complex_use"
72+
android:layout_width="match_parent"
73+
android:layout_height="wrap_content"
74+
android:text="一个复杂一点的应用场景" />
75+
5976
</LinearLayout>

readme.md

+1
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
>学习目标文章[这可能是最好的RxJava 2.x 入门教程](https://www.jianshu.com/p/a93c79e9f689)

readme1.md

+33
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
>学习目标文章[RxJava2.0——从放弃到入门](https://www.jianshu.com/p/cd3557b1a474)
2+
3+
### 1 . RxJava 2.x和RxJava 1.x的关系
4+
RxJava 2.x和RxJava 1.x的核心思想都是观察者模式,只不过RxJava 2.x在RxJava 1.x的基础上对一些方法进行了优化,方便开发者更好地的理解其编程思想;同时RxJava 2.x增加了一部分新的方法来解决1.x中存在的问题,比如背压等。
5+
#### 1.1 观察者模式
6+
举例:读者订阅了连载小说,当小说有了新的连载更新后会主动推送给读者,读者不用时刻盯着小说连载。这就是观察者模式。
7+
8+
### 2 . RxJava 2.x的异步和链式编程
9+
10+
**RxJava最常用的写法:异步 + 链式编程**
11+
12+
RxJava是支持异步的,通过Scheduler(英文名为调度器)来控制线程,当没有设置Scheduler时,RxJava遵循哪个线程产生就在哪个线程消费的原则,也就是说线程不会发生变化,始终在同一个。
13+
14+
一般使用RxJava的场景都是后台执行,前台调用,这就需要使用Scheduler来进行线程的调度了。
15+
16+
observeOn(AndroidSchedulers.mainThread()):事件回调的线程在主线程。
17+
18+
subscribeOn(Schedulers.io()):事件执行的线程在io线程(子线程);这里也可以使用Schedulers.newThread(),但是io线程可以重用空闲的线程,因此多数情况下io()比newThread()更有效率。
19+
20+
### 3 . RxJava的应用场景
21+
22+
**所有用到异步的地方,都可以使用RxJava来完成**
23+
24+
RxJava的好处:“随着程序逻辑变得越来越复杂,RxJava依然能够保持简洁”。
25+
26+
比如:依次加载十张图片(加载图片是耗时过程),其中第六张延时3秒加载,第七张复制到sd卡中,第八张要上传至网络。如果是使用Handler,必然是各种嵌套,逻辑复杂得再看一眼都难受,但是如果是使用RxJava呢——不会有任何嵌套,逻辑依然简洁。
27+
28+
29+
30+
31+
32+
33+

0 commit comments

Comments
 (0)