簡介
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