平时我们在请求错误的情况下,通常会进行处理一下,一般来说,主要分为两方面的错误:

1、没有网络的错误
2、在有网络的情况下,我们客户端的错误或者服务器端的错误

今天这篇博客主要阐述以下问题:

1、怎样监听网络状态的变化,包括是否打开WiFi,否打开数据网络,当前连接的网络是否可用和Observer对网络状态变化的处理
2、网络没有打开情况下的处理,如弹出对话框,跳转到 打开 WiFi设置的界面等
3、非WiFi情况下是否加载图片,是否播放视频等

一、观察者模式 Observer

观察者模式定义了一个一对多的依赖关系,让多个观察者对象同时监听一个被观察者,当被观察者发生改变时会通知观察者作出相应的改变。 使用步骤如下:

   1.观察者 NetworkWatcher 实现Observer 接口。
   2.被观察者 NetworkChange 继承Observable 类。
   3.观察者 NetworkWatcher 向被观察者 NetworkChange 订阅事件(将观察者NetworkWatcher 添加到被观察者 NetworkChange 里面去)。
   4.被观察者 NetworkChange 数据有改变,通知观察者 NetworkWatcher 相应的数据有改变,请作出相应的操作。
   5.观察者 NetworkWatcher 向被观察者 NetworkChange 取消订阅事件(将观察者NetworkWatcher 从被观察者 NetworkChange 中移除)。

代码如下:

观察者
import java.util.*;

/**
 * Created by :Luo
 * <p> 观察者类
 * Created Time :2017/8/30
 */

public class NetworkWatcher implements java.util.Observer {

    @Override
    public void update(Observable o, Object arg) {
    }
}
被观察者类
import java.util.Observable;

/**
 * Created by :Luo
 * <p>  被观察者类
 * Created Time :2017/8/30
 */

public class NetworkChange extends Observable {

    private static NetworkChange instance = null;

    public static NetworkChange getInstance() {
        if (null == instance) {
            instance = new NetworkChange();
        }
        urn instance;
    } //通知观察者数据改变
    public void notifyDataChange(Network net) {
        //被观察者怎么通知观察者数据有改变了呢??这里的两个方法是关键。
        setChanged();
        notifyObservers(net);
    }

}
Network数据类
/**
 * Created by :Luo
 * <p>  Network数据类
 * Created Time :2017/8/30
 */

public class Network {

    private boolean wifi;
    private boolean mobile;
    private boolean connected;

    public Network() {
    }

    public boolean isConnected() {
        return connected;
    }

    public void setConnected(boolean connected) {
        this.connected = connected;
    }

    public boolean isWifi() {
        return wifi;
    }

    public void setWifi(boolean wifi) {
        this.wifi = wifi;
    }

    public boolean isMobile() {
        return mobile;
    }

    public void setMobile(boolean mobile) {
        this.mobile = mobile;
    }

}

二、广播监测网络状态变化

1、在AndroidManifest文件里面注册
<receiver android:name=".NetworkConnectChangedReceiver"/>
2、在MyApplication中调用 Context registerReceiver(Receiver,IntentFilter) 进行注册
/**
 * Created by :Luo
 * <p>
 * Created Time :2017/8/30
 */

public class MyApp extends Application{

    private NetworkConnectChangedReceiver networkConnectChangedReceiver = new NetworkConnectChangedReceiver();

    @Override
    public void onCreate() {
        super.onCreate();

        IntentFilter filter = new IntentFilter();
        filter.addAction("android.net.conn.CONNECTIVITY_CHANGE");
        filter.addAction("android.net.wifi.WIFI_STATE_CHANGE");
        filter.addAction("android.net.conn.STATE_CHANGE");

        registerReceiver(networkConnectChangedReceiver, filter);

    }

}
自定义的 NetworkConnectChangedReceiver 广播
/**
 * Created by :Luo
 * <p>
 * Created Time :2017/8/28
 */

public class NetworkConnectChangedReceiver extends BroadcastReceiver {

    Network network = new Network();

    @Override
    public void onReceive(Context context, Intent intent) {

        if (ConnectivityManager.CONNECTIVITY_ACTION.equals(intent.getAction())) {
            ConnectivityManager manager = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
            NetworkInfo activeNetworkInfo = manager.getActiveNetworkInfo();
            if (activeNetworkInfo != null) {
                if (activeNetworkInfo.isConnected()) {

                    network.setConnected(true);
                    //通知观察者网络状态已改变
                    NetworkChange.getInstance().notifyDataChange(network);
                    if (activeNetworkInfo.getType() == ConnectivityManager.TYPE_WIFI) {

                        network.setWifi(true);
                        //通知观察者网络状态已改变
                        NetworkChange.getInstance().notifyDataChange(network);
                        Toast.makeText(context, "当前wifi连接可用", Toast.LENGTH_SHORT).show();
                    } else if (activeNetworkInfo.getType() == ConnectivityManager.TYPE_MOBILE) {

                        network.setMobile(true);
                        //通知观察者网络状态已改变
                        NetworkChange.getInstance().notifyDataChange(network);
                        Toast.makeText(context, "当前移动网络连接可用", Toast.LENGTH_SHORT).show();
                    }
                } else {

                    network.setConnected(false);
                    //通知观察者网络状态已改变
                    NetworkChange.getInstance().notifyDataChange(network);
                    Toast.makeText(context, "当前没有网络连接,请确保你已经打开网络", Toast.LENGTH_SHORT).show();
                }
            } else {
                network.setWifi(false);
                network.setMobile(false);
                network.setConnected(false);
                //通知观察者网络状态已改变
                NetworkChange.getInstance().notifyDataChange(network);
                Toast.makeText(context, "当前没有网络连接,请确保你已经打开网络", Toast.LENGTH_SHORT).show();
            }
        }


    }
}

三、观察者对于网络章台变化所做出的处理

/**
 * Created by :Luo
 * <p>  观察者
 * Created Time :2017/8/30
 */
public class MainActivity extends AppCompatActivity {

    private ImageView iv;

    private NetworkWatcher watcher = new NetworkWatcher() {

        @Override
        public void update(Observable observable, Object data) {
            super.update(observable, data);
            //观察者接受到被观察者的通知,来更新自己的数据操作。
            Network network = (Network) data;
            if(network.isConnected()){
                Glide.with(MainActivity.this).load("url").into(iv);
            }
        }

    };

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        iv = (ImageView) findViewById(R.id.iv);

    }

    @Override
    protected void onResume() {
        super.onResume();
        //观察者往被观察者中添加订阅事件。
        NetworkChange.getInstance().addObserver(watcher);
    }

    @Override
    protected void onPause() {
        super.onPause();
        //观察者从被观察者队列中移除
        NetworkChange.getInstance().deleteObserver(watcher);
    }
}

目前代码写到这里就可以监测网络状态变化,并且观察者可以随不同网络状态作出对应的操作。