Android-分享一個(gè)檢測(cè)網(wǎng)絡(luò)狀態(tài)的開(kāi)源庫(kù)(ReactiveNetwork)

圖片來(lái)源網(wǎng)絡(luò),入侵必刪

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

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容