
在日常的Android項(xiàng)目開(kāi)發(fā)中,我們肯定會(huì)遇到需要檢測(cè)用戶設(shè)備的網(wǎng)絡(luò)狀態(tài)。防止用戶沒(méi)有網(wǎng)絡(luò)的情況下,我們的應(yīng)用沒(méi)有提示。這里分享一個(gè)快速實(shí)現(xiàn)網(wǎng)絡(luò)監(jiān)聽(tīng)的開(kāi)源庫(kù)——ReactiveNetwork
ReactiveNetwork
ReactiveNetwork是一個(gè)使用RxJava Observables監(jiān)聽(tīng)網(wǎng)絡(luò)連接狀態(tài)和Internet連接的開(kāi)源庫(kù)。它是使用響應(yīng)式編程方法重寫(xiě)的網(wǎng)絡(luò)事件庫(kù)的繼承者。庫(kù)支持新舊網(wǎng)絡(luò)監(jiān)控策略。最小 SDK 版本是9。
ReactiveNetwork引入
dependencies {
implementation 'com.github.pwittchen:reactivenetwork-rx2:3.0.8'
}
截止我發(fā)布博客,當(dāng)前版本是3.0.8。開(kāi)源庫(kù)版本最新版本請(qǐng)看開(kāi)源庫(kù)文檔。
ReactiveNetwork的使用
觀察網(wǎng)絡(luò)連接:
ReactiveNetwork
.observeNetworkConnectivity(context)
.subscribeOn(Schedulers.io())
... // anything else what you can do with RxJava
.observeOn(AndroidSchedulers.mainThread())
.subscribe(connectivity -> {
// do something with connectivity
// you can call connectivity.state();
// connectivity.type(); or connectivity.toString();
});
持續(xù)觀察互聯(lián)網(wǎng)連接:
ReactiveNetwork
.observeInternetConnectivity()
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(isConnectedToInternet -> {
// do something with isConnectedToInternet value
});
與OkHttp一起集成
private Observable<Response> getResponse(String url) {
OkHttpClient client = new OkHttpClient();
Request request = new Request.Builder().url(url).build();
return Observable.create(emitter -> {
try {
Response response = client.newCall(request).execute();
emitter.onNext(response);
} catch (IOException exception) {
emitter.onError(exception);
} finally {
emitter.onComplete();
}
});
}
我們需要連接兩個(gè)流:
ReactiveNetwork
.observeNetworkConnectivity(getApplicationContext())
.flatMap(connectivity -> {
if (connectivity.state() == NetworkInfo.State.CONNECTED) {
return getResponse("http://github.com");
}
return Observable.error(() -> new RuntimeException("not connected"));
})
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(
response -> /* handle response here */,
throwable -> /* handle error here */)
);
與Retrofit一起集成
需要配置 Retrofit:
Retrofit retrofit = new Retrofit.Builder()
.baseUrl("https://api.github.com/")
.addCallAdapterFactory(RxJava2CallAdapterFactory.create())
.addConverterFactory(GsonConverterFactory.create())
.build();
如你所見(jiàn),我們需要RxJava2CallAdapterFactory在這里。接下來(lái),我們需要使用 RxJavaSingle類型定義適當(dāng)?shù)慕涌冢?/p>
public interface GitHubService {
@GET("users/{user}/repos")
Single<List<Repo>> listRepos(@Path("user") String user);
}
并實(shí)例化服務(wù):
GitHubService service = retrofit.create(GitHubService.class);
接下來(lái),每當(dāng)我們連接到網(wǎng)絡(luò)時(shí),我們想調(diào)用使用 Retrofit 定義的端點(diǎn)。我們可以這樣做:
ReactiveNetwork
.observeNetworkConnectivity(getApplicationContext())
.flatMapSingle(connectivity -> service.listRepos("pwittchen"))
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(
repos -> /* handle repos here */,
throwable -> /* handle error here */
);
ReactiveNetwork的混淆配置
-dontwarn com.github.pwittchen.reactivenetwork.library.rx2.ReactiveNetwork
-dontwarn io.reactivex.functions.Function
-dontwarn rx.internal.util.**
-dontwarn sun.misc.Unsafe