NetBus —— 讓你的 App 內(nèi)部隨處感知網(wǎng)絡的變化

簡介

NetBus 是一個實時監(jiān)聽網(wǎng)絡狀態(tài)的一個框架鬓梅,接入簡單嵌灰。只需要幾步就可以在 Activity 和 Fragment 以及其他要觀測的類中很方便的收到網(wǎng)絡狀態(tài)變化的通知享钞。

愿景
  • 可以在 App 任意位置監(jiān)聽網(wǎng)絡的變化
  • 同一類中監(jiān)聽不同類型的網(wǎng)絡
  • 監(jiān)聽者可以指定不同的網(wǎng)絡環(huán)境
  • 布局封裝,簡化布局狀態(tài)切換
使用

添加依賴

implementation 'com.github.meetsl.netbus:SNetBus:1.1'

初始化
在項目最開始的地方需要對 NetBus 進行初始化粗合,例如 Application 或者 啟動頁中初始化痕届。初始化代碼如下:

//初始化 NetBus(必須)
NetBus.init(this)
//全局設置公共布局(可選)
NetBus.initNetView(loadResId = R.layout.layout_loading_view, netErrorResId = R.layout.layout_net_error_view)

添加監(jiān)聽

  • Activity 或者 Fragment 中添加監(jiān)聽

Activity 或者 Fragment中注冊該接收者,在 onCreate() 或者 onCreateView() 中添加注冊:

NetBus.getDefault().register(this)

然后需要在類中添加一個只有一個 boolean 類型參數(shù)的方法并添加注解:

/**
*  接受網(wǎng)絡狀態(tài)變化通知的方法
*
*  @param isAvailable : true 當前 NetMode 下網(wǎng)絡可用徘公;false 無網(wǎng)絡狀態(tài)牲证,與 NetMode 無關
*/
@NetSubscribe(netMode = NetMode.WIFI, threadMode = ThreadMode.MAIN, priority = 1)
fun onNetEvent(isAvailable: Boolean) {
   Log.i("Callback_Network", "${this.javaClass} $name 網(wǎng)絡變化了")
}

OK,Activity 或者 Fragment 對網(wǎng)絡的監(jiān)聽這樣子就可以了关面。如果你的項目中 Activity 或者 Fragment 中有父類坦袍,則注冊的這個操作放在父類中也是可以的。

  • 在其他位置中監(jiān)聽網(wǎng)絡變化

在代碼中新建一個 NetBusTest 的測試類等太,示例代碼完整的展示了如何進行監(jiān)聽:

public class NetBusTest {

   /**
    * 需要在適當?shù)臅r機捂齐,比如類對象創(chuàng)建的時候就進行注冊
    */
   public void run() {
       NetBus.Companion.getDefault().register(this);
   }

   /**
    * 接收網(wǎng)絡狀態(tài)變化,這里監(jiān)聽的是移動數(shù)據(jù)網(wǎng)絡
    *
    * @param isAvailable true 當前 NetMode 下網(wǎng)絡可用缩抡;false 無網(wǎng)絡狀態(tài)奠宜,與 NetMode 無關
    */
   @NetSubscribe(netMode = NetMode.CELLULAR, threadMode = ThreadMode.MAIN, priority = 1)
   public void onEvent(boolean isAvailable) {
       Log.i("Callback_Network", "NetBusTest ---- 網(wǎng)絡變化了");
   }

   /**
    * 在類對象不再被使用或者銷毀的時候,進行解注冊
    */
   public void stop() {
       NetBus.Companion.getDefault().unregister(this);
   }
}

在類中添加了一個 run() 和一個 stop() 方法用于注冊和解注冊瞻想,onEvent 方法用于接收網(wǎng)絡狀態(tài)變化压真。與 Activity 或者 Fragment 不一樣的地方就是需要我們自己手動解注冊,這一點需要在使用的時候注意一下蘑险。

輔助開發(fā)

在該框架中還提供了一個用于輔助開發(fā)的布局 PageStateLayout ,在一個正常的業(yè)務 App 中滴肿,一個 Page 中一般會有三到四種的狀態(tài)布局,比如 EmptyLayout (無數(shù)據(jù)視圖) 佃迄、NetErrorLayout(網(wǎng)絡錯誤視圖)泼差、LoadLayout(加載視圖)以及 NormalLayout(正常顯示視圖)。這個輔助布局有一定的限制呵俏,大家可以根據(jù)場景決定使不使用堆缘。下面說一下這個布局的具體使用:

1. 設置全局狀態(tài)布局

比如我們的 App 設計的時候,網(wǎng)絡錯誤的視圖都是統(tǒng)一的普碎,那么我們可以將該試圖設置為全局視圖吼肥。這樣每一個 PageStateLayout 對象在顯示網(wǎng)絡錯誤視圖時,顯示的都是一個:(在 App 啟動頁或者 Application 中設置)

//全局設置公共布局
NetBus.initNetView(netErrorResId = R.layout.layout_net_error_view)

2. 設置局部狀態(tài)布局

由于每一個 Page 在同一狀態(tài)下布局可能不一致,所以提供了局部設置:

private lateinit var stateLayout: PageStateLayout

   override fun onCreate(savedInstanceState: Bundle?) {
       super.onCreate(savedInstanceState)
       stateLayout = PageStateLayout(this)
       //設置正常顯示視圖
       stateLayout.setNormalView(R.layout.activity_main)
       //設置該 Page 的 空視圖
       stateLayout.setEmptyView(R.layout.layout_empty_default)
       //設置該 Page 的加載視圖
       stateLayout.setLoadingView(R.layout.layout_loading_view)
       //設置該 Page 的網(wǎng)絡錯誤視圖
       stateLayout.setNetErrorView(R.layout.layout_net_error_view)
       //顯示
       setContentView(stateLayout)
       NetBus.getDefault().register(this)
   }

示例代碼說明了如何設置局部視圖潜沦,以及顯示使用

3.顯示調(diào)用

PageStateLayout 設置給 Page 后如何控制顯示布局萄涯,很簡單:

@NetSubscribe(netMode = NetMode.WIFI, threadMode = ThreadMode.POSTING, priority = 1)
   fun onEvent(isAvailable: Boolean) {
       println("網(wǎng)絡變化了")
       if (!isAvailable)
           stateLayout.showNetErrorView()
       else
           stateLayout.showNormalView()
       Log.i("Callback_Network", "MainActivity ----$isAvailable 網(wǎng)絡變化了")
   }

PageStateLayout 提供了 showXXXX 的方法來顯示布局

總結(jié)

到這里該框架基本就介紹完了绪氛,希望它可以在你的項目中唆鸡,很方便的幫助你監(jiān)聽網(wǎng)絡狀態(tài)。如果在使用中有什么問題或者建議枣察,能告訴我那就太棒了争占。框架會持續(xù)更新序目,這里放上框架的 github 地址臂痕,歡迎 star 以及 comment 。
NetBus Github

最后編輯于
?著作權歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末猿涨,一起剝皮案震驚了整個濱河市握童,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌叛赚,老刑警劉巖澡绩,帶你破解...
    沈念sama閱讀 212,718評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異俺附,居然都是意外死亡肥卡,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,683評論 3 385
  • 文/潘曉璐 我一進店門事镣,熙熙樓的掌柜王于貴愁眉苦臉地迎上來步鉴,“玉大人,你說我怎么就攤上這事璃哟》兆粒” “怎么了?”我有些...
    開封第一講書人閱讀 158,207評論 0 348
  • 文/不壞的土叔 我叫張陵随闪,是天一觀的道長阳似。 經(jīng)常有香客問我,道長蕴掏,這世上最難降的妖魔是什么障般? 我笑而不...
    開封第一講書人閱讀 56,755評論 1 284
  • 正文 為了忘掉前任,我火速辦了婚禮盛杰,結(jié)果婚禮上挽荡,老公的妹妹穿的比我還像新娘。我一直安慰自己即供,他們只是感情好定拟,可當我...
    茶點故事閱讀 65,862評論 6 386
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般青自。 火紅的嫁衣襯著肌膚如雪株依。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 50,050評論 1 291
  • 那天延窜,我揣著相機與錄音恋腕,去河邊找鬼。 笑死逆瑞,一個胖子當著我的面吹牛荠藤,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播获高,決...
    沈念sama閱讀 39,136評論 3 410
  • 文/蒼蘭香墨 我猛地睜開眼哈肖,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了念秧?” 一聲冷哼從身側(cè)響起淤井,我...
    開封第一講書人閱讀 37,882評論 0 268
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎摊趾,沒想到半個月后币狠,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,330評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡严就,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,651評論 2 327
  • 正文 我和宋清朗相戀三年总寻,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片梢为。...
    茶點故事閱讀 38,789評論 1 341
  • 序言:一個原本活蹦亂跳的男人離奇死亡渐行,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出铸董,到底是詐尸還是另有隱情祟印,我是刑警寧澤,帶...
    沈念sama閱讀 34,477評論 4 333
  • 正文 年R本政府宣布粟害,位于F島的核電站蕴忆,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏悲幅。R本人自食惡果不足惜套鹅,卻給世界環(huán)境...
    茶點故事閱讀 40,135評論 3 317
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望汰具。 院中可真熱鬧卓鹿,春花似錦、人聲如沸留荔。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,864評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至杰妓,卻和暖如春藻治,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背巷挥。 一陣腳步聲響...
    開封第一講書人閱讀 32,099評論 1 267
  • 我被黑心中介騙來泰國打工桩卵, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人句各。 一個月前我還...
    沈念sama閱讀 46,598評論 2 362
  • 正文 我出身青樓吸占,卻偏偏與公主長得像晴叨,于是被迫代替她去往敵國和親凿宾。 傳聞我的和親對象是個殘疾皇子兼蕊,可洞房花燭夜當晚...
    茶點故事閱讀 43,697評論 2 351

推薦閱讀更多精彩內(nèi)容