
圖片來源網(wǎng)絡,入侵必刪
在日常的Android項目開發(fā)中,我們肯定會遇到需要檢測用戶設備的網(wǎng)絡狀態(tài)。防止用戶沒有網(wǎng)絡的情況下,我們的應用沒有提示。這里分享一個快速實現(xiàn)網(wǎng)絡監(jiān)聽的開源庫——ReactiveNetwork
ReactiveNetwork
ReactiveNetwork是一個使用RxJava Observables監(jiān)聽網(wǎng)絡連接狀態(tài)和Internet連接的開源庫。它是使用響應式編程方法重寫的網(wǎng)絡事件庫的繼承者。庫支持新舊網(wǎng)絡監(jiān)控策略。最小 SDK 版本是9。
ReactiveNetwork引入
dependencies {
implementation 'com.github.pwittchen:reactivenetwork-rx2:3.0.8'
}
截止我發(fā)布博客,當前版本是3.0.8。開源庫版本最新版本請看開源庫文檔。
ReactiveNetwork的使用
觀察網(wǎng)絡連接:
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();
}
});
}
我們需要連接兩個流:
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();
如你所見,我們需要RxJava2CallAdapterFactory在這里。接下來,我們需要使用 RxJavaSingle類型定義適當?shù)慕涌冢?/p>
public interface GitHubService {
@GET("users/{user}/repos")
Single<List<Repo>> listRepos(@Path("user") String user);
}
并實例化服務:
GitHubService service = retrofit.create(GitHubService.class);
接下來,每當我們連接到網(wǎng)絡時,我們想調用使用 Retrofit 定義的端點。我們可以這樣做:
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