歡迎大家下載我個(gè)人開發(fā)的app安琪花園
為什么我說一行代碼就能實(shí)現(xiàn)網(wǎng)絡(luò)監(jiān)聽呢?
本人總結(jié)按照 “結(jié)論先行阳距, 詳細(xì)分析在后” 的邏輯疫蔓,
先讓大家的感性的認(rèn)識(shí), 然后理性的分析
結(jié)果
只需要在想要監(jiān)聽網(wǎng)絡(luò)變化的方法上面添加相應(yīng)的注解即可身冬。
具體的實(shí)現(xiàn)原理衅胀,大家也可以參考EventBus通過Apt技術(shù)是如何實(shí)現(xiàn)。
為什么要將網(wǎng)絡(luò)監(jiān)聽封裝成一個(gè)庫
網(wǎng)絡(luò)監(jiān)聽可以說是在app中基本上會(huì)遇到的一個(gè)功能酥筝。
就我目前開發(fā)的項(xiàng)目而言滚躯,到處都在寫網(wǎng)絡(luò)監(jiān)聽的代碼,感覺相當(dāng)麻煩嘿歌,
而且 代碼冗余掸掏, 提高了耦合性,而且代碼可讀性也下降了宙帝。
自從寫了這個(gè)庫以后丧凤,以后項(xiàng)目里面要監(jiān)聽網(wǎng)絡(luò)變化只需要添加注解即可
具體是如何使用的呢?
如果你的項(xiàng)目上線后是混淆過的步脓, 那一定要注意:需要在用到網(wǎng)絡(luò)監(jiān)聽的類上面添加keep注解防止混淆愿待,以免上線后出問題。
例子:
在混淆文件里面添加:
-keepclasseswithmembernames class * {
@com.richzjc.netannotation.* <methods>;
}
在項(xiàng)目的根目錄下面的build.gralde添加maven倉庫靴患。
maven { url "https://dl.bintray.com/richzjc/maven" }
其次是在module的build.gradle引用
如果項(xiàng)目用的kotlin 請(qǐng)將annotationProcessor 改成kapt
annotationProcessor 'com.richzjc:netChange_compiler:1.1.2'
implementation 'com.richzjc:network_change:1.0.9'
因?yàn)轫?xiàng)目使用了apt的技術(shù)仍侥,在編譯期會(huì)生成類,
因此需要在對(duì)應(yīng)module下面的gradle文件添加如下配置
javaCompileOptions {
annotationProcessorOptions {
arguments = [ moduleName : project.getName() ]
}
}
則最后會(huì)生成NetChanger的類:
如:
public class NetChanger implements SubscribeInfoIndex {
private static final Map<Class, SimpleSubscribeInfo> SUBSCRIBER_INDEX;
static {
SUBSCRIBER_INDEX = new HashMap<Class, SimpleSubscribeInfo>();
List<SubscribeMethod> availableList;
List<SubscribeMethod> loseList;
List<SubscribeMethod> changeList;
availableList = new ArrayList();
loseList = new ArrayList();
changeList = new ArrayList();
availableList.add(new SubscribeMethod("test1", null));
loseList.add(new SubscribeMethod("test", null));
changeList.add(new SubscribeMethod("test2", NetType.AUTO));
changeList.add(new SubscribeMethod("test3", NetType.WIFI));
SUBSCRIBER_INDEX.put(MainActivity.class, new SimpleSubscribeInfo(availableList, loseList, changeList));
}
@Override
public Map<Class, SimpleSubscribeInfo> getSubscriberInfo() {
return SUBSCRIBER_INDEX;
}
}
在使用這個(gè)庫的時(shí)候需要在對(duì)應(yīng)的Application下面初始化:
將apt生成的類添加到NetManager里面蚁廓。 然后調(diào)用init方法
NetManager.addIndex(new NetChanger());
NetManager.init(this);
最后如果在MainActivity里面想要添加網(wǎng)絡(luò)監(jiān)聽访圃,則需要在MainActivity里面
添加注冊(cè)與 反注冊(cè)的方法:
如: 在Oncreate里面添加注冊(cè):
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
NetManager.bind(this);
}
一般在ondestroy方法里面添加反注冊(cè)
@Override
protected void onDestroy() {
super.onDestroy();
NetManager.unBind(this);
}
如果按照以上配置好了。 那么在MainActivity里面添加的代碼
就能夠監(jiān)聽到網(wǎng)絡(luò)的變化相嵌。
詳細(xì)說明
NetAvailable
監(jiān)聽到有網(wǎng)絡(luò)
NetLose
監(jiān)聽沒有網(wǎng)絡(luò)
NetChange
該注解需要傳一個(gè)netType
netType有四個(gè)取值可能
public enum NetType {
AUTO, WIFI, MOBILE, NONE;
}
當(dāng)netType傳為AUTO 就相當(dāng)于NetAvailable
當(dāng)netType傳為NONE就相當(dāng)于 NetLose
當(dāng)netType傳為MOBILE就相當(dāng)于 監(jiān)聽除wifi以外的網(wǎng)絡(luò)
當(dāng)netType傳為WIFI就相當(dāng)于 監(jiān)聽wifi
相關(guān)文章
kotlin DSL開發(fā)
android 面試題
android 夜間模式的切換
快速獲取Bundle里面參數(shù)
android EventBus源碼閱讀
AOP之動(dòng)態(tài)代理原理
Handler源碼理解
IOC框架之Dagger詳解
多學(xué)總比少學(xué)好
所謂 面試造飛機(jī)腿时, 入職擰螺絲
。 這句話一點(diǎn)也不假饭宾, 面試時(shí)的技術(shù)不僅僅 是 要學(xué)會(huì)用, 還得要知其原理批糟。懂其原理,才能區(qū)分其技術(shù)水平看铆, 而作為android開發(fā)的我們徽鼎, java作為我們的開發(fā)語言。 所以面試官往往會(huì)問一些java底層的原理弹惦。這其中包括否淤, java 多線程, 各種各樣的鎖機(jī)制棠隐, 以及cas石抡, 原子性 的問題。
最近我在學(xué)習(xí)了這門課程后助泽,發(fā)現(xiàn)確實(shí)還不錯(cuò)啰扛。對(duì)以后的面試的幫助還是蠻不錯(cuò)的嚎京。