Android-分享一個檢測網(wǎng)絡狀態(tài)的開源庫(ReactiveNetwork)

圖片來源網(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
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
【社區(qū)內容提示】社區(qū)部分內容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內容

友情鏈接更多精彩內容