NetworkStateView(1)——具备网络状态监听并自动切换的View

来源:互联网 发布:高见泽俊彦 知乎 编辑:程序博客网 时间:2024/06/07 08:30

What?

本库是基于该项目进行的二次封装:
https://github.com/AlarmZeng/NetworkStateView

这个库是集成了如下功能:
- 保留基本库原有的使用方式(对应不同网络状态的布局【参考】)
- 网络判断工具类
- 网络状态变化的广播
- 对应封装的逻辑基类
- 包装类:NetLinearWrapContainer

Why?

为何要封装?
- 1.主要是工作中用到了多种网络状态切换,然后同事一看对我说,“你这用着不爽,每个类都要去include一下。不开心”。
- 2.将网络监测相关代码汇总到NetObserverActivity,NetObserverAppCompatActivity,NetObserverFragment,详见Demo。

Target!

我们的目标是!没有蛀牙! 让网络状态View逻辑上变得简单。

也就是说要实现这样的效果时,我们只需要做如下操作:

  • BaseActivity/BaseFragment extentds NetObserverActivity/NetObserverFragment
    • BaseActivity/BaseFragment 内编写如下代码:
      super.initNetState(rootView);//rootView是页面根布局
  • 页面根布局定义为:
<com.netstatus.NetLinearWrapContainer xmlns:android="http://schemas.android.com/apk/res/android"    xmlns:app="http://schemas.android.com/apk/res-auto"    xmlns:tools="http://schemas.android.com/tools"    android:layout_width="match_parent"    android:layout_height="match_parent"    android:background="@color/transparent"    android:orientation="vertical"    tools:context="com.sound.haolei.operate.ui.fragment.HomeFragment">

关注的这3个点,便可以轻松的使用这个库。(其实本人还想再将这3个点省去,但是奈何水平有限,还是会产生一定的侵入代码)

Dependencies!

  • Step 1. Add it in your root build.gradle at the end of repositories:
allprojects {        repositories {            ...            maven { url 'https://www.jitpack.io' }        }    }
  • Step 2. Add the dependency:
dependencies {            compile 'com.github.zj614android:netstateview:1.0.0'}

若想修改源码时,可以:

compile project(':netstateview')

How?

基础使用方式:

参考原项目

xml

<?xml version="1.0" encoding="utf-8"?><LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"    xmlns:app="http://schemas.android.com/apk/res-auto"    xmlns:tools="http://schemas.android.com/tools"    android:layout_width="match_parent"    android:layout_height="match_parent"    android:orientation="vertical"    tools:context="demo.netstate.com.netstatedemo.LittleActivity">    <include layout="@layout/view_network_state" />    <TextView        android:layout_width="wrap_content"        android:layout_height="wrap_content"        android:layout_centerHorizontal="true"        android:layout_marginTop="20dp"        android:text="突突突~突突~"        android:textSize="30sp" /></LinearLayout>

java代码

package demo.netstate.com.netstatedemo;import android.support.v7.app.AppCompatActivity;import android.os.Bundle;import com.netstatus.NetworkStateView;public class LittleActivity extends AppCompatActivity {    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_little);        com.netstatus.NetworkStateView nv = (NetworkStateView) findViewById(R.id.nsv_state_view);        nv.showLoading();    }}

NetLinearWrapContainer包装类的使用:

基本:

xml

<?xml version="1.0" encoding="utf-8"?><com.netstatus.NetLinearWrapContainer xmlns:android="http://schemas.android.com/apk/res/android"    xmlns:tools="http://schemas.android.com/tools"    android:layout_width="match_parent"    android:layout_height="match_parent"    android:gravity="center"    android:orientation="vertical">    <TextView        android:layout_width="wrap_content"        android:layout_height="wrap_content"        android:layout_centerHorizontal="true"        android:layout_marginTop="20dp"        android:text="突突突~突突~"        android:textSize="30sp" /></com.netstatus.NetLinearWrapContainer>

java代码

package demo.netstate.com.netstatedemo;import android.os.Bundle;import demo.netstate.com.netstatedemo.base.BaseAppCompatActivity;public class CommonActivity extends BaseAppCompatActivity {    @Override    public void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_common);    }}

NetLinearWrapContainer & extends BaseAppCompatActivit做了这些事:
- 自动往根布局里添加状态视图,注意目前只支持vertical的NetLinearWrapContainer
- 自动注册网络监测
- 根据网络状态变化自动切换视图
- 支持自定义属性,是否拥有titleBar

这只是普通activity内的,还有fragment和带有actionbar的activity的使用方式。详细见demo

一个自定义属性:

<?xml version="1.0" encoding="utf-8"?><resources>    <declare-styleable name="NetLinearWrapContainer">        <attr name="haveActionBar" format="boolean" />    </declare-styleable></resources>

这个属性的作用是啥呢?当界面内需要用网络视图布局覆盖的组件有ActionBar的时候,那么这时候你就应该设置这个属性为true那么这个Ui会自动添加到布局元素的index2,布局的index机制请自行百度。

app:haveActionBar=”true”

<?xml version="1.0" encoding="utf-8"?><com.netstatus.NetLinearWrapContainer xmlns:android="http://schemas.android.com/apk/res/android"    xmlns:tools="http://schemas.android.com/tools"    android:layout_width="match_parent"    android:layout_height="match_parent"    android:gravity="center"    app:haveActionBar="true"    android:orientation="vertical">    <TextView        android:layout_width="wrap_content"        android:layout_height="wrap_content"        android:layout_centerHorizontal="true"        android:layout_marginTop="20dp"        android:text="突突突~突突~"        android:textSize="30sp" /></com.netstatus.NetLinearWrapContainer>

局限性:

根布局用这个组件进行布局的时候,由于他是一个LinearLayout,且只支持vertical。

三个包装类:

NetObserverActivity.java
NetObserverAppCompatActivity.java
NetObserverFragment.java

这三个类是封装类,里边做了网络状态相关的初始化,具体怎么集成,可以看Demo内的Base基类是如何封装的。

点击按钮”重新加载”的点击事件设置:

可选的 Override 3个回调(你不想用可以不写):

    public interface OnRefreshListener {        /**         * 空的刷新按钮         */        void netWorkStatusEmptyRefresh();        /**         * 网络错误刷新按钮         */        void netWorkStatusErrorRefresh();        /**         * 没有网络刷新按钮         */        void netWorkStatusNoNetWorkRefresh();    }

状态切换:

$NetObserverAppCompatActivity.java

    /**     * NetStatus相关     */    protected void showEmpty(){        if(null != mNetworkStateView){            mNetworkStateView.showEmpty();        }else {            Log.e("NetState","mNetworkStateView为空");        }    }    /**     * NetStatus相关     */    protected void showSuccess(){        if(null != mNetworkStateView){            mNetworkStateView.showSuccess();        }else {            Log.e("NetState","mNetworkStateView为空");        }    }    /**     * NetStatus相关     */    protected void showNoNet(){        if(null != mNetworkStateView){            mNetworkStateView.showNoNetwork();        }else {            Log.e("NetState","mNetworkStateView为空");        }    }    /**     * NetStatus相关     */    protected void showError(){        if(null != mNetworkStateView){            mNetworkStateView.showError();        }else {            Log.e("NetState","mNetworkStateView为空");        }    }

详见Demo

Demo

GitHub项目地址
结合网络请求使用的Demo
基本接入使用的Demo

最后,后面我会补上实现细节,并发一个帖子,有错误的地方请直接指出,我会修正改进,感谢。

原创粉丝点击