1. 程式人生 > >android 監聽網路狀態的變化+Observer

android 監聽網路狀態的變化+Observer

平時我們在請求錯誤的情況下,通常會進行處理一下,一般來說,主要分為兩方面的錯誤:

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);
    }
}

目前程式碼寫到這裡就可以監測網路狀態變化,並且觀察者可以隨不同網路狀態作出對應的操作。

喜歡就踩一下吧