android 監聽網路狀態的變化+Observer
阿新 • • 發佈:2019-01-28
平時我們在請求錯誤的情況下,通常會進行處理一下,一般來說,主要分為兩方面的錯誤:
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);
}
}
目前程式碼寫到這裡就可以監測網路狀態變化,並且觀察者可以隨不同網路狀態作出對應的操作。
喜歡就踩一下吧