简介

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

NetBus —— 让你的 App 内部随处感知网络的变化的更多相关文章

  1. 碰到一个在app内部浏览器锚点异常的问题

    最近在做一个文章评论的功能,其中一个需求是:在提交完评论后,需要跳转到位于页面底部的评论区域,正常情况下location.href=http://m.hostname.cn/article#comme ...

  2. 苹果拒绝App内部使用版本检测功能

    10.6 - Apple and our customers place a high value on simple, refined, creative, well thought through ...

  3. Android APP 内部捐赠实现(支付宝&微信)

    Android APP 内部捐赠实现(支付宝&微信) 目前支持 支付宝和 微信. 项目地址:https://github.com/didikee/AndroidDonate https://p ...

  4. android app内部更新适配到8.0

    app 内部跟新是app中必须要有的功能,在app出现改变时,app内部更新能以最快的速度将应用提升到最新版本. 步骤: 1.获取本地app的版本号 int versionCode = 0; try ...

  5. 上门洗车APP --- Androidclient开发 之 网络框架封装介绍(二)

    上门洗车APP --- Androidclient开发 之 网络框架封装介绍(二) 前几篇博文中给大家介绍了一下APP中的基本业务及开发本项目使用的网络架构: 上门洗车APP --- Androidc ...

  6. cordova在app内部指定浏览器打开链接插件:cordova-plugin-inappbrowser

    原文网址:http://www.ncloud.hk/%E6%8A%80%E6%9C%AF%E5%88%86%E4%BA%AB/cordova-plugin-inappbrowser/ 要想App里边的 ...

  7. iOS - 跳到系统App内部设置

    从App中跳转到手机设置中此App内的设置授权界面: NSURL *url = [NSURL URLWithString:UIApplicationOpenSettingsURLString]; if ...

  8. app接口,如何保证是由app内部调用而非外部模拟post请求调用。

    在爬虫快手主播信息的时候,发现只要我改动一下参数,比如第一页 page=1的时候,需要爬下一页,把page改为2发现提示sign验证失败了 也就是说,快手在开发的时候考虑了有人抓包到接口后,通过修改参 ...

  9. 如何获得APP内部资源

    安装一个iTools(百度一下就有) 用USB连接设备,打开iTools

随机推荐

  1. ESP8266 RTOS SDK(IDF)编译环境搭建

    前提条件 按照https://www.cnblogs.com/ansersion/p/10458171.html的步骤搭建非IDF环境 下载 https://github.com/espressif/ ...

  2. ios APNS注册失败 本地push

    - (void)addLocalNotice:(NSString *)titlepush { if (@available(iOS 10.0, *)) { UNUserNotificationCent ...

  3. 用微信小程序连接leancloud数据库注意事项~

    具体步骤转载如下: 官网教程 大佬提示 注意事项: 1.下载的av-weapp-min.js,需要放在当前项目名称的子目录pages下 2.如上述教程,需要注册leancloud和AppID,并写在a ...

  4. 透析SOA、RPC、SOAP、REST、ICE、ESB模型发展史

    最初的程序全是单机程序,没有网络,没有RPC,更没有RESTful.程序猿写的东西孤独运行在单机上. 那时的程序猿们语言相通,参与开发同一套系统的团队可以面对面沟通. 网络出现了.网络,也带来变乱.网 ...

  5. MAVEN简介之——settings.xml

    概述 Maven的settings.xml配置了Maven执行的方式,像pom.xml一样,但是它是一个通用的配置, 不能绑定到任何特殊的项目.它通常包括本地仓库地址,远程仓库服务,认证信息等. se ...

  6. IT题库9-线程池的概念和原理

    在什么情况下使用线程池? 1.单个任务处理的时间比较短:2.需要处理的任务的数量大: 使用线程池的好处: 1.减少在创建和销毁线程上所花的时间以及系统资源的开销.2.如不使用线程池,有可能造成系统创建 ...

  7. 错误:软件包:3:docker-ce-18.09.4-3.el7.x86_64 (docker-ce-stable) 需要:container-selinux >= 2.9

    命令:yum -y install http://mirror.centos.org/centos/7/extras/x86_64/Packages/container-selinux-2.68-1. ...

  8. pom的maven仓库的配置

    这里简单记录一下问题 本人配置了nexus的私人仓库,配置阿里云的远程仓库(http://182.92.29.40/nexus/content/groups/public/)和正规的2个库(http: ...

  9. sql 与 mysql 链接数据库

  10. 介绍Kubernetes监控Heapster

    什么是Heapster? Heapster是容器集群监控和性能分析工具,天然的支持Kubernetes和CoreOS,Kubernetes有个出名的监控agent—cAdvisor.在每个kubern ...