需求:

  网络连接断开 弹出popupwindow 当前网络连接断开 网络恢复时popupwindow 消失重新请求网络。

需求描述完毕 上一张帅图

  

思路:广播 发送及时消息 断网flag  popupwindow何时展示 大致就是这些需要考虑

吐槽:好久没写了 忙着换工作 赶新项目进度 新项目 用的是Dagger2 + RxJava + Retrofit + RxBus + DataBinding 很酸爽

后面又时间会跟大家分享。欢迎加入QQ群 521039620一块讨论 后面我们会一起讨论热修复 增量更新kotlin等 互相学习~。

直接上代码:

  广播代码:

  

/**
* 使用广播去监听网络
* Created by 邓鉴恒 on 16/9/13.
  感谢这个哥们儿~ 找不到参考地址了 这里保留他的名字 谢谢了
*/
public class NetStateReceiver extends BroadcastReceiver { private final static String ANDROID_NET_CHANGE_ACTION = "android.net.conn.CONNECTIVITY_CHANGE";
private final static String TAG = NetStateReceiver.class.getSimpleName(); private static boolean isNetAvailable = false;
private static HttpUtil.NetType mNetType;
private static ArrayList<NetChangeObserver> mNetChangeObservers = new ArrayList<NetChangeObserver>();
private static BroadcastReceiver mBroadcastReceiver; private static BroadcastReceiver getReceiver() {
if (null == mBroadcastReceiver) {
synchronized (NetStateReceiver.class) {
if (null == mBroadcastReceiver) {
mBroadcastReceiver = new NetStateReceiver();
}
}
}
return mBroadcastReceiver;
} @Override
public void onReceive(Context context, Intent intent) {
mBroadcastReceiver = NetStateReceiver.this;
if (intent.getAction().equalsIgnoreCase(ANDROID_NET_CHANGE_ACTION)) {
if (!HttpUtil.isNetworkAvailable(context)) {
Log.e(this.getClass().getName(), "<--- network disconnected --->");
isNetAvailable = false;
} else {
Log.e(this.getClass().getName(), "<--- network connected --->");
isNetAvailable = true;
mNetType = HttpUtil.getAPNType(context);
}
notifyObserver();
}
} /**
* 注册
*
* @param mContext
*/
public static void registerNetworkStateReceiver(Context mContext) {
IntentFilter filter = new IntentFilter();
filter.addAction(ANDROID_NET_CHANGE_ACTION);
mContext.getApplicationContext().registerReceiver(getReceiver(), filter);
} /**
* 清除
*
* @param mContext
*/
public static void checkNetworkState(Context mContext) {
Intent intent = new Intent();
intent.setAction(ANDROID_NET_CHANGE_ACTION);
mContext.sendBroadcast(intent);
} /**
* 反注册
*
* @param mContext
*/
public static void unRegisterNetworkStateReceiver(Context mContext) {
if (mBroadcastReceiver != null) {
try {
mContext.getApplicationContext().unregisterReceiver(mBroadcastReceiver);
} catch (Exception e) { }
} } public static boolean isNetworkAvailable() {
return isNetAvailable;
} public static HttpUtil.NetType getAPNType() {
return mNetType;
} private void notifyObserver() {
if (!mNetChangeObservers.isEmpty()) {
int size = mNetChangeObservers.size();
for (int i = 0; i < size; i++) {
NetChangeObserver observer = mNetChangeObservers.get(i);
if (observer != null) {
if (isNetworkAvailable()) {
observer.onNetConnected(mNetType);
} else {
observer.onNetDisConnect();
}
}
}
}
} /**
* 添加网络监听
*
* @param observer
*/
public static void registerObserver(NetChangeObserver observer) {
if (mNetChangeObservers == null) {
mNetChangeObservers = new ArrayList<NetChangeObserver>();
}
mNetChangeObservers.add(observer);
} /**
* 移除网络监听
*
* @param observer
*/
public static void removeRegisterObserver(NetChangeObserver observer) {
if (mNetChangeObservers != null) {
if (mNetChangeObservers.contains(observer)) {
mNetChangeObservers.remove(observer);
}
}
}
}
// 接口:
  
public interface NetChangeObserver {
/**
* 网络连接回调 type为网络类型
*/
void onNetConnected(HttpUtil.NetType type);
/**
* 没有网络
*/
void onNetDisConnect();
}

  

  BaseActivity:

//网络观察者
protected NetChangeObserver mNetChangeObserver = null;
protected NetworkPopupWindow networkWindow; protected boolean network = true;
 onCreate:
mNetChangeObserver = new NetChangeObserver() {
@Override
public void onNetConnected(HttpUtil.NetType type) {
if (networkWindow != null && networkWindow.isShowing()) {
networkWindow.dismiss();
}
onNetworkConnected(type);
network = true;
} @Override
public void onNetDisConnect() {
network = false;
onNetworkDisConnected();
}
};
//开启广播去监听 网络 改变事件
NetStateReceiver.registerObserver(mNetChangeObserver); //======================baseacivity中重写
/**
* 网络连接状态
* @param type 网络状态
*/
protected void onNetworkConnected(HttpUtil.NetType type) {
} /**
* 网络断开的时候调用
*/
protected void onNetworkDisConnected() {
} //相关类如下 ================================
/**
* 处理网络断开的dialog显示
*/ private View decorView; @Override
public void onWindowFocusChanged(boolean hasFocus) {
super.onWindowFocusChanged(hasFocus);
if (hasFocus && !network) {
if (networkWindow == null) {
networkWindow = new NetworkPopupWindow(BaseActivity.this);
Rect rect = new Rect();
decorView = getWindow().getDecorView();
decorView.getWindowVisibleDisplayFrame(rect);
int statusBarHeight = rect.top; //状态栏高度
Log.d("标题栏高度", "onWindowFocusChanged: " + statusBarHeight);
}
decorView.post(() -> networkWindow.showAtLocation(decorView, Gravity.TOP, 0,
0));
}
}
public class NetworkPopupWindow extends PopupWindow {

    public NetworkPopupWindow(final Context context) {

        LayoutInflater inflater = (LayoutInflater) context
.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
View mMenuView = inflater.inflate(R.layout.networkpopupwindow, null); mMenuView.setOnClickListener(v -> context.startActivity(new Intent(Settings.ACTION_SETTINGS)));
// 设置SelectPicPopupWindow的View
this.setContentView(mMenuView);
// 设置SelectPicPopupWindow弹出窗体的宽
this.setWidth(LayoutParams.FILL_PARENT);
// 设置SelectPicPopupWindow弹出窗体的高
this.setHeight(LayoutParams.WRAP_CONTENT);
// 设置SelectPicPopupWindow弹出窗体可点击
this.setFocusable(false);
// 设置SelectPicPopupWindow弹出窗体动画效果
// this.setAnimationStyle(R.style.AnimBottom);
// 实例化一个ColorDrawable颜色为半透明
ColorDrawable dw = new ColorDrawable(9000);
// 设置SelectPicPopupWindow弹出窗体的背景
this.setBackgroundDrawable(dw);
} }
//layout 布局 wifi_off_icon一张图片 可要可不要
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
>   
<TextView
android:layout_width="match_parent"
android:layout_height="45dip"
android:background="#ffdcd0"
android:drawableLeft="@drawable/wifi_off_icon"
android:drawablePadding="12.5dip"
android:gravity="center_vertical"
android:paddingLeft="10dip"
android:text="世界上最遥远的距离就是没网。检查设置"
android:textColor="#665b55" /> </RelativeLayout>

  Application:

@Override
public void onCreate() {
super.onCreate();
  NetStateReceiver.registerNetworkStateReceiver(this);//初始化网络监听
}
@Override
public void onLowMemory() {
super.onLowMemory();
NetStateReceiver.unRegisterNetworkStateReceiver(this);
android.os.Process.killProcess(android.os.Process.myPid());
exit();
}

   

  RxBus(没用到 扩展):

/**
* 使用RxBus 代替 event bus
* Created by kcw001 on 2016/7/21.
*/
public class RxBus { private static volatile RxBus INSTANCE = new RxBus(); private final Subject<Object,Object> bus; private final Map<Class<?>,Object> mStickyEventMap; public RxBus(){
bus = new SerializedSubject<>(PublishSubject.create());
mStickyEventMap = new ConcurrentHashMap<>();//存
} public static RxBus getDefault(){
if(INSTANCE==null){
synchronized (RxBus.class){
if(INSTANCE==null){
INSTANCE = new RxBus();
}
}
}
return INSTANCE;
} /**
* 发送事件 单靠一种类型完全解决不了我们的需求 Sticky 方式补充
* @param event
*/
public void post(Object event){
synchronized (mStickyEventMap){
mStickyEventMap.put(event.getClass(),event);
}
bus.onNext(event);
} /**
* 根据eventType获取Sticky事件
*/
public <T> T getStickyEvent(Class<T> eventType) {
synchronized (mStickyEventMap) {
return eventType.cast(mStickyEventMap.get(eventType));
}
} /**
* 根据传递的eventType 类型返回eventType的观察者
*/
public <T> Observable<T> toObservable(Class<T> eventType){
synchronized (mStickyEventMap) {
Observable<T> observable = bus.ofType(eventType);
Object event = mStickyEventMap.get(eventType);
if(event!=null){
return Observable.merge(observable,Observable.create(new Observable.OnSubscribe<T>(){ @Override
public void call(Subscriber<? super T> subscriber) {
subscriber.onNext(eventType.cast(event));
}
}));
}else{
return observable;
}
}
//return bus.ofType(eventType);
}
}

  Activity中(集成baseActivity):

@Override
protected void onNetworkConnected(HttpUtil.NetType type) {
if (!network) {
initUi();//重新请求网络
network = true;
}
} @Override
protected void onNetworkDisConnected() {//断网 }

    

大致如上 如有遗漏或者更好的想法 欢迎加群 学习交流

QQ群521039620

  

Android 动态监听网络 断网重连的更多相关文章

  1. Android实时监听网络状态

    Android实时监听网络状态(1)   其实手机在网络方面的的监听也比较重要,有时候我们必须实时监控这个程序的实时网络状态,android在网络断开与连接的时候都会发出广播,我们通过接收系统的广播就 ...

  2. Android实时监听网络状态(2)

    在开发android应用时,涉及到要进行网络访问,时常需要进行网络状态的检查,以提供给用户必要的提醒.一般可以通过ConnectivityManager来完成该工作. ConnectivityMana ...

  3. Android实时监听网络状态(1)

    其实手机在网络方面的的监听也比较重要,有时候我们必须实时监控这个程序的实时网络状态,android在网络断开与连接的时候都会发出广播,我们通过接收系统的广播就可以实现网络的监听. 1.添加访问网络和获 ...

  4. android动态注册监听网络变化异常

    在使用广播接收器监听网络变化的时候,在AndroidManifest.xml中加入<user-permission android:name="android.permission.A ...

  5. Android 5.0 以上监听网络变化

    大家好,大概有一个多月没有更新博客了,我是干什么去了呢?很明显,程序员当然要加班……这一次跟大家分享一下新项目的一些心得. 监听网络变化在开发中是经常用到的,例如我们断网有一些友好的提示,或者根据不同 ...

  6. Android开发之使用广播监听网络状态变化

    我们经常需要判断网络状态的变化,如有无网络,所以需要监听网络状态的变化,比如网络断开,网络连接给予友好提示.如何监听网络状态的变化呢,最近工作中需要用到这个,于是就用广播机制来实现了网络状态的监听. ...

  7. Android 监听网络变化

    Android 监听网络变化

  8. Android 监听 Android中监听系统网络连接打开或者关闭的实现代码

    本篇文章对Android中监听系统网络连接打开或者关闭的实现用实例进行了介绍.需要的朋友参考下 很简单,所以直接看代码 复制代码 代码如下: package xxx; import android.c ...

  9. 通过BroadCast与service时时监听网络变化

    首先需要一个service: 这里我定义了一个NetworkStateService,在这个service中我写了一个BroadcastReceiver用于监听网络状态发生改变的情况并在这个servi ...

随机推荐

  1. flex 用footerdatagrid做列的汇总合计

    之前用flex+c#做的一个项目中,有涉及到列的汇总计算.可以用到的方法很多,这里列举了一种,在前台flash中用footerdatagrid结合labelfunction的用法即可实现.当然,下面的 ...

  2. java这些东西发展(4)-------无穷time of error

    今天,有些郁闷的心情啊.空指针下午折磨.到现在为止仍然没有得到解决,专家的招募结果没拿到,我们必须继续自己的,进而改变一点点一点点地找到它,但现在我不想搞,准备回家,这浪费了一个多小时,之前记录的下一 ...

  3. String.Join的实现

    String.Join的实现 在开发中,有时候会遇到需要把一个List对象中的某个字段用一个分隔符拼成一个字符串的情况.比如在SQL语句的in条件中,我们通常需要把List<int>这样的 ...

  4. ASP.NET SignalR 2.0入门指南

    ASP.NET SignalR 2.0入门指南 介绍SignalR ASP.NET SignalR 是一个为 ASP.NET 开发人员的库,简化了将实时 web 功能添加到应用程序的过程.实时Web功 ...

  5. leetcode Binary Tree Postorder Traversal 二叉树后续遍历

    先给出递归版本的实现方法,有时间再弄个循环版的.代码如下: /** * Definition for binary tree * struct TreeNode { * int val; * Tree ...

  6. MVC 5 的 EF6 Code First 入门 系列:排序、筛选和分页

    这是微软官方SignalR 2.0教程Getting Started with Entity Framework 6 Code First using MVC 5 系列的翻译,这里是第三篇:排序.筛选 ...

  7. Ninject 在 Winform、 Asp.net MVC中连络EntityFramework的应用

    Ninject 在 Winform. Asp.net MVC中连络EntityFramework的应用( 注入同一个DbContext的应用名人名言:科学是老老实实的东西,它要靠许许多多人民的劳动和智 ...

  8. SQLSERVER 总结1

    数据:描述事物的符号记录 数据库:按照数据结构来组织和存储管理的数据仓库 数据库管理系统:位于用户与操作系统之间的一层数据管理软件 数据库系统:在计算机系统中引入数据库后的系统构成.由数据库,数据库管 ...

  9. Web API 2

    Asp.Net Web API 2 官网菜鸟学习系列导航[持续更新中]   前言 本来一直参见于微软官网进行学习的, 官网网址http://www.asp.net/web-api.出于自己想锻炼一下学 ...

  10. TOGAF架构能力框架之架构委员会和架构合规性

    TOGAF架构能力框架之架构委员会和架构合规性 3. 架构委员会 正如前面所说,一个用来对架构治理策略的实现进行监督的跨组织的架构委员会是架构治理策略成功的主要要素之一.架构委员会应该能够代表所有主要 ...