1. 程式人生 > >NetBus —— 讓你的 App 內部隨處感知網路的變化

NetBus —— 讓你的 App 內部隨處感知網路的變化

簡介

NetBus 是一個實時監聽網路狀態的一個框架,接入簡單。只需要幾步就可以在 Activity 和 Fragment 以及其他要觀測的類中很方便的收到網路狀態變化的通知。

願景

  • 可以在 App 任意位置監聽網路的變化
  •  同一類中監聽不同型別的網路
  • 監聽者可以指定不同的網路環境
  • 佈局封裝,簡化佈局狀態切換

使用

1. 新增依賴

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

2.  初始化

在專案最開始的地方需要對 NetBus 進行初始化,例如 Application 或者 啟動頁中初始化。初始化程式碼如下:

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

3.  新增監聽

  • Activity 或者 Fragment 中新增監聽

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

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` 的測試類,示例程式碼完整的展示瞭如何進行監聽:

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` 不一樣的地方就是需要我們自己手動解註冊,這一點需要在使用的時候注意一下。

輔助開發

在該框架中還提供了一個用於輔助開發的佈局  `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 。

SNetBus Github