激情久久久_欧美视频区_成人av免费_不卡视频一二三区_欧美精品在欧美一区二区少妇_欧美一区二区三区的

服務(wù)器之家:專注于服務(wù)器技術(shù)及軟件下載分享
分類導(dǎo)航

PHP教程|ASP.NET教程|Java教程|ASP教程|編程技術(shù)|正則表達(dá)式|C/C++|IOS|C#|Swift|Android|VB|R語言|JavaScript|易語言|vb.net|

服務(wù)器之家 - 編程語言 - Android - Android使用觀察者模式Observer實(shí)現(xiàn)網(wǎng)絡(luò)狀態(tài)監(jiān)聽

Android使用觀察者模式Observer實(shí)現(xiàn)網(wǎng)絡(luò)狀態(tài)監(jiān)聽

2022-02-25 15:26Hui_2017 Android

這篇文章主要為大家詳細(xì)介紹了Android使用觀察者模式Observer實(shí)現(xiàn)網(wǎng)絡(luò)狀態(tài)監(jiān)聽,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下

在Android開發(fā)過程中,很多時(shí)候都會(huì)用到當(dāng)前網(wǎng)絡(luò)的狀態(tài)判斷以及網(wǎng)絡(luò)狀況發(fā)生變化的時(shí)候做出相應(yīng)的反應(yīng),要想監(jiān)聽網(wǎng)絡(luò)狀態(tài),用觀察者模式再合適不過了,廢話不多說,直接上代碼。

觀察者模式屬于面向?qū)ο蟮?3中設(shè)計(jì)模式之一,不了解的同學(xué)請(qǐng)自行Google

既然用觀察者模式,自然離不開觀察者模式里最重要的兩個(gè)類Subject和Ovserver了

Subjcet接口:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
/**
 * Description: observer subject
 * author: Wang
 * date: 11/28/16 11:19 AM
 *
 * Copyright©2016 by wang. All rights reserved.
 */
public interface NetConnectionSubject {
 
  /**
   * 注冊(cè)觀察者
   *
   * @param observer
   */
  public void addNetObserver(NetConnectionObserver observer);
 
  /**
   * 移除觀察者
   *
   * @param observer
   */
  public void removeNetObserver(NetConnectionObserver observer);
 
  /**
   * 狀態(tài)更新通知
   *
   * @param type
   */
  public void notifyNetObserver(int type);
}

Observer接口:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
/**
 * Description: observer
 * author: Wang
 * date: 11/28/16 11:20 AM
 *
 * Copyright©2016 by wang. All rights reserved.
 */
public interface NetConnectionObserver {
 
  /**
   * 通知觀察者更改狀態(tài)
   *
   * @param type
   */
  public void updateNetStatus(int type);
}

在Android里,最適合實(shí)現(xiàn)Subject類的,莫過于Application了,因?yàn)樗治ㄒ欢疑芷诰褪沁@個(gè)App的生命周期:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
/**
 * Description: App's application should extend this class
 * author: Wang
 * date: 11/28/16 10:34 AM
 *
 * Copyright©2016 by wang. All rights reserved.
 */
public abstract class BaseApplication extends Application implements NetConnectionSubject {
 
  protected static BaseApplication instance;
 
  private int currentNetType = -1;
 
  private List<NetConnectionObserver> observers = new ArrayList<>();
 
 
  public static BaseApplication getInstance() {
    return instance;
  }
 
  /**
   * current net connection type
   *
   * @return
   */
  public int getCurrentNetType() {
    return currentNetType;
  }
 
  /**
   * current net connection status
   *
   * @return
   */
  public boolean isNetConnection() {
    return currentNetType == NetWorkUtil.NET_NO_CONNECTION ? false : true;
  }
 
  @Override
  public void onCreate() {
    super.onCreate();
 
    instance = this;
 
    currentNetType = NetWorkUtil.getConnectionType(this);
 
  }
 
  @Override
  public void addNetObserver(NetConnectionObserver observer) {
    if (!observers.contains(observer)) {
      observers.add(observer);
    }
  }
 
  @Override
  public void removeNetObserver(NetConnectionObserver observer) {
    if (observers != null && observers.contains(observer)) {
      observers.remove(observer);
    }
  }
 
  @Override
  public void notifyNetObserver(int type) {
 
    /**
     * 避免多次發(fā)送相同的網(wǎng)絡(luò)狀態(tài)
     */
    if (currentNetType == type) {
      return;
    } else {
      currentNetType = type;
      if (observers != null && observers.size() > 0) {
        for (NetConnectionObserver observer : observers) {
          observer.updateNetStatus(type);
        }
      }
    }
  }
}

具體誰要實(shí)現(xiàn)Observer接口,就要看具體場(chǎng)景了,這里以Activity為栗子吧:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
/**
 * Description: TODO
 * author: WangKunHui
 * date: 16/12/30 下午3:08
 * <p>
 * Copyright©2016 by wang. All rights reserved.
 */
public class TestActivity extends Activity implements NetConnectionObserver {
 
  @Override
  protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    /**省略一些方法**/
    BaseApplication.getInstance().addNetObserver(this);
  }
 
  @Override
  public void updateNetStatus(int type) {
    //當(dāng)監(jiān)聽網(wǎng)絡(luò)狀態(tài)發(fā)生變化 這里會(huì)及時(shí)的收到回饋
  }
 
  @Override
  protected void onDestroy() {
    super.onDestroy();
 
    BaseApplication.getInstance().removeNetObserver(this);
  }
}

這里有個(gè)地方一定要注意:當(dāng)Activity銷毀的時(shí)候,一定要把這個(gè)觀察者從觀察者隊(duì)列里移除掉!否者會(huì)發(fā)生內(nèi)存泄漏

到這里,觀察者模式已經(jīng)寫完了,謝謝收看。

讀者:你是不是忘了點(diǎn)什么,說好的網(wǎng)絡(luò)監(jiān)聽呢?
我:Easy easy~  剛剛只不過是中場(chǎng)休息

如果只有上面那么多的話,是不能監(jiān)聽網(wǎng)絡(luò)狀態(tài)的,想要監(jiān)聽網(wǎng)絡(luò)狀態(tài)的變化,還得靠我們的廣播接收者啊,有請(qǐng):

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
/**
 * Description: 網(wǎng)絡(luò)連接狀態(tài)的監(jiān)聽
 * author: Wang
 * date: 16/8/3 下午10:54
 *
 * Copyright©2016 by wang. All rights reserved.
 */
public class NetConnectionReceiver extends BroadcastReceiver {
 
  @Override
  public void onReceive(Context context, Intent intent) {
 
    if (intent.getAction().equals(ConnectivityManager.CONNECTIVITY_ACTION)) {
      int connectionType = NetWorkUtil.getConnectionType(context);
 
      /**
       * 更改網(wǎng)絡(luò)狀態(tài)
       */
      if (BaseApplication.getInstance() != null) {
        BaseApplication.getInstance().notifyNetObserver(connectionType);
      }
    }
  }
}

NetWorkUtil:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
/**
 * @author Wang
 * @version 1.0.0
 * @description 網(wǎng)絡(luò)操作工具類
 * @create 2014-2-18 上午09:22:30
 * @company
 */
 
public class NetWorkUtil {
 
/**
   * 無網(wǎng)絡(luò)鏈接
   */
  public static final int NET_NO_CONNECTION = 0;
 
  /**
   * wifi
   */
  public static final int NET_TYPE_WIFI = 1;
 
  public static final int NET_TYPE_2G = 2;
 
  public static final int NET_TYPE_3G = 3;
 
  public static final int NET_TYPE_4G = 4;
 
  /**
   * 未知的網(wǎng)絡(luò)類型
   */
  public static final int NET_TYPE_UNKNOWN = 5;
 
 /**
   * 獲取網(wǎng)絡(luò)類型
   *
   * @param context
   * @return
   */
  public static int getConnectionType(Context context) {
 
    int netType = NET_NO_CONNECTION;
 
    NetworkInfo networkInfo = ((ConnectivityManager)
   context.getSystemService(Context.CONNECTIVITY_SERVICE)).getActiveNetworkInfo();
 
    if (networkInfo == null) {
 
      netType = NET_NO_CONNECTION;
    } else {
 
      if (networkInfo.getType() == ConnectivityManager.TYPE_WIFI) {
        netType = NET_TYPE_WIFI;
      } else {
 
        int networkType = networkInfo.getSubtype();
 
        switch (networkType) {
          case TelephonyManager.NETWORK_TYPE_GPRS:
          case TelephonyManager.NETWORK_TYPE_EDGE:
          case TelephonyManager.NETWORK_TYPE_CDMA:
          case TelephonyManager.NETWORK_TYPE_1xRTT:
          case TelephonyManager.NETWORK_TYPE_IDEN: //api<8 : replace by 11
            netType = NET_TYPE_2G;
            break;
          case TelephonyManager.NETWORK_TYPE_UMTS:
          case TelephonyManager.NETWORK_TYPE_EVDO_0:
          case TelephonyManager.NETWORK_TYPE_EVDO_A:
          case TelephonyManager.NETWORK_TYPE_HSDPA:
          case TelephonyManager.NETWORK_TYPE_HSUPA:
          case TelephonyManager.NETWORK_TYPE_HSPA:
          case TelephonyManager.NETWORK_TYPE_EVDO_B: //api<9:replace by 14
          case TelephonyManager.NETWORK_TYPE_EHRPD: //api<11:replace by 12
          case TelephonyManager.NETWORK_TYPE_HSPAP: //api<13:replace by 15
            netType = NET_TYPE_3G;
            break;
          case TelephonyManager.NETWORK_TYPE_LTE:  //api<11:replace by 13
            netType = NET_TYPE_4G;
            break;
          default:
 
            String subType = networkInfo.getSubtypeName();
 
            if (subType.equalsIgnoreCase("TD-SCDMA") ||
              subType.equalsIgnoreCase("WCDMA") ||
              subType.equalsIgnoreCase("CDMA2000")) {
              netType = NET_TYPE_3G;
            } else {
              netType = NET_TYPE_UNKNOWN;
            }
 
            break;
        }
      }
    }
    return netType;
  }
}

好了,到這里,標(biāo)題上所有的內(nèi)容已經(jīng)寫完了,最后,別忘了權(quán)限和注冊(cè)廣播接收者。

以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持服務(wù)器之家。

原文鏈接:https://blog.csdn.net/u012370834/article/details/53943636

延伸 · 閱讀

精彩推薦
Weibo Article 1 Weibo Article 2 Weibo Article 3 Weibo Article 4 Weibo Article 5 Weibo Article 6 Weibo Article 7 Weibo Article 8 Weibo Article 9 Weibo Article 10 Weibo Article 11 Weibo Article 12 Weibo Article 13 Weibo Article 14 Weibo Article 15 Weibo Article 16 Weibo Article 17 Weibo Article 18 Weibo Article 19 Weibo Article 20 Weibo Article 21 Weibo Article 22 Weibo Article 23 Weibo Article 24 Weibo Article 25
主站蜘蛛池模板: 国产超碰人人做人人爱ⅴa 色天天综合网 | 一级做a爱片久久 | 中文字幕在线永久视频 | av在线免费看片 | 一级片在线免费观看 | 成人在线视频精品 | 中文字幕免费看 | 久久国产成人午夜av浪潮 | 亚洲一区二区三区高清 | 91美女福利视频 | 成人性生活视频在线观看 | 欧美三日本三级少妇三级99观看视频 | 欧美精品久久久久久久久久 | 极品xxxx欧美一区二区 | 国产一级在线观看视频 | 男女羞羞的视频 | 亚洲四播房 | 超91在线 | 欧美日韩经典在线 | 精品久久久久久亚洲精品 | 91麻豆精品国产91久久久更新资源速度超快 | 欧美成人精品一区二区三区 | 欧美精品一区二区免费 | 黄网站在线免费 | 国产精品爱久久久久久久 | 欧美特一级片 | 欧美性生交xxxxx免费观看 | 男人天堂免费 | 欧美一级电影网站 | 曰批全过程120分钟免费69 | 欧美a在线观看 | 中文字幕国 | 黄色片视频观看 | 中国免费黄色 | 一级黄色在线观看 | 亚洲精品一区中文字幕 | 一级观看免费完整版视频 | 神马顶级推理片免费看 | 欧美性猛交xxx乱大交3蜜桃 | 午夜精品久久久久久中宇 | 黄色网址在线视频 |