Skip to content

Commit 2a4eca1

Browse files
committed
add retryDemo
1 parent 4d0fea2 commit 2a4eca1

File tree

3 files changed

+156
-1
lines changed

3 files changed

+156
-1
lines changed

app/src/main/AndroidManifest.xml

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@
1111
android:roundIcon="@mipmap/ic_launcher_round"
1212
android:supportsRtl="true"
1313
android:theme="@style/AppTheme">
14-
<activity android:name=".functionUsage_Demo.RxJavafixRetrofit">
14+
<activity android:name=".functionUsage_Demo.RxJavafixRetrofit2">
1515
<intent-filter>
1616
<action android:name="android.intent.action.MAIN" />
1717

@@ -28,6 +28,9 @@
2828

2929
<activity android:name=".FilterUsage">
3030
</activity>
31+
<activity android:name=".functionUsage_Demo.RxJavafixRetrofit">
32+
</activity>
33+
3134
<activity android:name=".MainActivity">
3235
</activity>
3336
</application>

app/src/main/java/scut/carson_ho/rxjava_operators/functionUsage_Demo/RxJavafixRetrofit.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@
2424

2525
/**
2626
* Created by Carson_Ho on 17/9/9.
27+
* Demo for 轮询
2728
*/
2829

2930
public class RxJavafixRetrofit extends AppCompatActivity {
Lines changed: 151 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,151 @@
1+
package scut.carson_ho.rxjava_operators.functionUsage_Demo;
2+
3+
import android.os.Bundle;
4+
import android.support.v7.app.AppCompatActivity;
5+
import android.util.Log;
6+
7+
import com.jakewharton.retrofit2.adapter.rxjava2.RxJava2CallAdapterFactory;
8+
9+
import java.io.IOException;
10+
import java.util.concurrent.TimeUnit;
11+
12+
import io.reactivex.Observable;
13+
import io.reactivex.ObservableSource;
14+
import io.reactivex.Observer;
15+
import io.reactivex.android.schedulers.AndroidSchedulers;
16+
import io.reactivex.annotations.NonNull;
17+
import io.reactivex.disposables.Disposable;
18+
import io.reactivex.functions.Function;
19+
import io.reactivex.schedulers.Schedulers;
20+
import retrofit2.Retrofit;
21+
import retrofit2.converter.gson.GsonConverterFactory;
22+
import scut.carson_ho.rxjava_operators.R;
23+
import scut.carson_ho.rxjava_operators.establishUsage_Demo.GetRequest_Interface;
24+
import scut.carson_ho.rxjava_operators.establishUsage_Demo.Translation;
25+
26+
/**
27+
* Created by Carson_Ho on 17/9/11.
28+
* Demo for 出错重试
29+
*/
30+
31+
public class RxJavafixRetrofit2 extends AppCompatActivity {
32+
33+
private static final String TAG = "Rxjava";
34+
35+
// 设置变量
36+
// 可重试次数
37+
private int maxConnectCount = 10;
38+
// 当前已重试次数
39+
private int currentRetryCount = 0;
40+
// 重试等待时间
41+
private int waitRetryTime = 0;
42+
43+
@Override
44+
protected void onCreate(Bundle savedInstanceState) {
45+
super.onCreate(savedInstanceState);
46+
setContentView(R.layout.activity_main);
47+
48+
// 步骤1:创建Retrofit对象
49+
Retrofit retrofit = new Retrofit.Builder()
50+
.baseUrl("http://fy.iciba.com/") // 设置 网络请求 Url
51+
.addConverterFactory(GsonConverterFactory.create()) //设置使用Gson解析(记得加入依赖)
52+
.addCallAdapterFactory(RxJava2CallAdapterFactory.create()) // 支持RxJava
53+
.build();
54+
55+
// 步骤2:创建 网络请求接口 的实例
56+
GetRequest_Interface request = retrofit.create(GetRequest_Interface.class);
57+
58+
// 步骤3:采用Observable<...>形式 对 网络请求 进行封装
59+
Observable<Translation> observable = request.getCall();
60+
61+
// 步骤4:发送网络请求 & 通过retryWhen()进行重试
62+
// 注:主要异常才会回调retryWhen()进行重试
63+
observable.retryWhen(new Function<Observable<Throwable>, ObservableSource<?>>() {
64+
@Override
65+
public ObservableSource<?> apply(@NonNull Observable<Throwable> throwableObservable) throws Exception {
66+
// 参数Observable<Throwable>中的泛型 = 上游操作符抛出的异常,可通过该条件来判断异常的类型
67+
return throwableObservable.flatMap(new Function<Throwable, ObservableSource<?>>() {
68+
@Override
69+
public ObservableSource<?> apply(@NonNull Throwable throwable) throws Exception {
70+
Log.d(TAG, "发生异常,需重试");
71+
/**
72+
* 需求1:根据异常类型选择是否重试
73+
* 即,当发生的异常 = 网络异常 = IO异常 才选择重试
74+
*/
75+
if (throwable instanceof IOException){
76+
77+
// 输出异常信息
78+
Log.d(TAG, "发生的异常 = " + throwable.toString());
79+
80+
/**
81+
* 需求2:限制重试次数
82+
* 即,当已重试次数 < 设置的重试次数,才选择重试
83+
*/
84+
if (currentRetryCount < maxConnectCount){
85+
86+
// 记录重试次数
87+
currentRetryCount++;
88+
Log.d(TAG, "重试次数 = " + currentRetryCount);
89+
90+
/**
91+
* 需求2:实现重试
92+
* 通过返回的Observable发送的事件 = Next事件,从而实现重试功能
93+
*/
94+
// 设置等待时间
95+
waitRetryTime = 2000 + currentRetryCount* 1000;
96+
Log.d(TAG, "等待时间 =" + waitRetryTime);
97+
return Observable.just(1).delay(waitRetryTime, TimeUnit.MILLISECONDS);
98+
99+
/**
100+
* 需求3:延迟1段时间再重试
101+
* 采用delay操作符 = 延迟一段时间发送,以实现重试间隔设置
102+
*
103+
* 需求4:遇到的异常越多,时间越长
104+
* 直接在delay操作符的等待时间内设置 = 每重试1次,增多延迟重试时间1s
105+
*/
106+
107+
}else{
108+
109+
return Observable.error(new Throwable("重试次数已超过设置次数 = " +currentRetryCount + ",即 不再重试"));
110+
111+
}
112+
}
113+
114+
// 若无发生异常,则不重试
115+
// 不重试通过返回的Observable发送的事件 = Error事件 实现
116+
// 该异常错误信息可在观察者中的onError()中获得
117+
118+
else{
119+
return Observable.error(new Throwable("发生了非网络异常(非I/O异常)"));
120+
}
121+
122+
}
123+
});
124+
}
125+
}).subscribeOn(Schedulers.io()) // 切换到IO线程进行网络请求
126+
.observeOn(AndroidSchedulers.mainThread()) // 切换回到主线程 处理请求结果
127+
.subscribe(new Observer<Translation>() {
128+
@Override
129+
public void onSubscribe(Disposable d) {
130+
}
131+
132+
@Override
133+
public void onNext(Translation result) {
134+
// e.接收服务器返回的数据
135+
result.show() ;
136+
}
137+
138+
@Override
139+
public void onError(Throwable e) {
140+
// 获取停止重试的信息
141+
Log.d(TAG, e.toString());
142+
}
143+
144+
@Override
145+
public void onComplete() {
146+
147+
}
148+
});
149+
150+
}
151+
}

0 commit comments

Comments
 (0)