NetBus 是一個實時監聽網絡狀態的一個框架,接入簡單。只須要幾步就能夠在 Activity 和 Fragment 以及其餘要觀測的類中很方便的收到網絡狀態變化的通知。java
1. 添加依賴git
implementation 'com.github.meetsl.netbus:SNetBus:1.1'
2. 初始化github
在項目最開始的地方須要對 NetBus 進行初始化,例如 Application 或者 啓動頁中初始化。初始化代碼以下:網絡
//初始化 NetBus(必須) NetBus.init(this) //全局設置公共佈局(可選) NetBus.initNetView(loadResId = R.layout.layout_loading_view, netErrorResId = R.layout.layout_net_error_view)
3. 添加監聽框架
- 在 `Activity` 或者 `Fragment`中註冊該接收者,在 `onCreate()` 或者 `onCreateView()` 中添加註冊:ide
NetBus.getDefault().register(this)
- 而後須要在類中添加一個只有一個 boolean 類型參數的方法並添加註解:佈局
/** * 接受網絡狀態變化通知的方法 * * @param isAvailable : true 當前 NetMode 下網絡可用;false 無網絡狀態,與 NetMode 無關 */ @NetSubscribe(netMode = NetMode.WIFI, threadMode = ThreadMode.MAIN, priority = 1) fun onNetEvent(isAvailable: Boolean) { Log.i("Callback_Network", "${this.javaClass} $name 網絡變化了") }
- OK,Activity 或者 Fragment 對網絡的監聽這樣子就能夠了。若是你的項目中 Activity 或者 Fragment 中有父類,則註冊的這個操做放在父類中也是能夠的。測試
- 在代碼中新建一個 `NetBusTest` 的測試類,示例代碼完整的展現瞭如何進行監聽:this
public class NetBusTest { /** * 須要在適當的時機,好比類對象建立的時候就進行註冊 */ public void run() { NetBus.Companion.getDefault().register(this); } /** * 接收網絡狀態變化,這裏監聽的是移動數據網絡 * * @param isAvailable true 當前 NetMode 下網絡可用;false 無網絡狀態,與 NetMode 無關 */ @NetSubscribe(netMode = NetMode.CELLULAR, threadMode = ThreadMode.MAIN, priority = 1) public void onEvent(boolean isAvailable) { Log.i("Callback_Network", "NetBusTest ---- 網絡變化了"); } /** * 在類對象再也不被使用或者銷燬的時候,進行解註冊 */ public void stop() { NetBus.Companion.getDefault().unregister(this); } }
- 在類中添加了一個 `run()` 和一個 `stop()` 方法用於註冊和解註冊,`onEvent` 方法用於接收網絡狀態變化。與 `Activity` 或者 `Fragment` 不同的地方就是須要咱們本身手動解註冊,這一點須要在使用的時候注意一下。spa
在該框架中還提供了一個用於輔助開發的佈局 `PageStateLayout` ,在一個正常的業務 App 中,一個 Page 中通常會有三到四種的狀態佈局,好比 EmptyLayout (無數據視圖) 、NetErrorLayout(網絡錯誤視圖)、LoadLayout(加載視圖)以及 NormalLayout(正常顯示視圖)。這個輔助佈局有必定的限制,你們能夠根據場景決定使不使用。下面說一下這個佈局的具體使用:
- 好比咱們的 App 設計的時候,網絡錯誤的視圖都是統一的,那麼咱們能夠將該試圖設置爲全局視圖。這樣每個 `PageStateLayout` 對象在顯示網絡錯誤視圖時,顯示的都是一個:(在 App 啓動頁或者 Application 中設置)
//全局設置公共佈局 NetBus.initNetView(netErrorResId = R.layout.layout_net_error_view)
- 因爲每個 Page 在同一狀態下佈局可能不一致,因此提供了局部設置:
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 的網絡錯誤視圖 stateLayout.setNetErrorView(R.layout.layout_net_error_view) //顯示 setContentView(stateLayout) NetBus.getDefault().register(this) }
- 示例代碼說明了如何設置局部視圖,以及顯示使用
- 將 `PageStateLayout` 設置給 Page 後如何控制顯示佈局,很簡單:
@NetSubscribe(netMode = NetMode.WIFI, threadMode = ThreadMode.POSTING, priority = 1) fun onEvent(isAvailable: Boolean) { println("網絡變化了") if (!isAvailable) stateLayout.showNetErrorView() else stateLayout.showNormalView() Log.i("Callback_Network", "MainActivity ----$isAvailable 網絡變化了") }
- `PageStateLayout` 提供了 `showXXXX` 的方法來顯示佈局
到這裏該框架基本就介紹完了,但願它能夠在你的項目中,很方便的幫助你監聽網絡狀態。若是在使用中有什麼問題或者建議,能告訴我那就太棒了。框架會持續更新,這裏放上框架的 github 地址,歡迎 star 以及 comment 。