不知不覺我已有一個月沒有更新了唱遭。
群里有朋友說:“雞排,你變了〕适唬現(xiàn)在天天傳播雞湯拷泽。技術文章也不寫了⌒湔埃”
抱歉抱歉司致,最近工作上確實太忙了。是時候上盤新菜了聋迎。請各位大佬們品嘗品嘗脂矫。
本篇都講些什么?
- 如何排除第三方傳遞依賴導致的aar沖突
- 如何保持依賴最新的aar
- fragment里getActivity()空指針
- 代碼new 出來的VIew沒有ID
- 不傳遞的方式巧取context
- 不使用handle回到主線程(即UI線程)
- 防止VIew上信息被其他軟件截屏或系統(tǒng)截圖泄漏信息
- 專制接二手渣渣項目快速看方法調用棧順序
如何排除第三方傳遞依賴導致的aar沖突
開發(fā)過程中經常出現(xiàn)你需要依賴第三方的某個庫,比如下面的代碼所示:
dependencies {
compile 'com.github.BolexLiu:PressScanCode:v1.0.0'
}
PressScanCode是一個長按掃描屏幕上的二維碼工具庫,他底層的二維碼識別使用了zxing庫砌庄。我們假設作者開發(fā)時使用了老版本zxing 1.0.1的版本羹唠。而我們集成進來以后卻發(fā)現(xiàn)本身項目里也依賴Zxing 但是我們的版本是3.3.0的。由于包管理具有傳遞性娄昆。這時就會起沖突佩微。gradle無法自己處理你到底是該依賴哪個。下面是處理辦法萌焰。
//查看依賴 app是項目模塊名稱
/gradlew :app:dependencies --configuration compile
dependencies {
compile('com.github.BolexLiu:PressScanCode:v1.0.0'', {
exclude group: 'com.google.zxing' //排除依賴
})
compile 'com.google.zxing:core:3.3.0'
}
這樣做的意思排除PressScanCode原有的依賴哺眯。而選擇依賴我們自己設定的3.3.0的zxing庫。
如何保持依賴最新的aar
這個相當容易扒俯,代碼如下奶卓。你只需要將appcompat-v7:25.1.1這個版本好替換成“+”號即可每次都依賴最新的版本一疯。
dependencies {
// compile 'com.android.support:appcompat-v7:25.1.1'
compile 'com.android.support:+'
}
fragment里getActivity()空指針
重寫fragment然后在onAttach方法存下一個Activity引用。在其他地方需用用到context或者Activity的時候使用該引用夺姑。而不使用getActivity()墩邀。可以規(guī)避這個問題盏浙。但請留意強引用可能會導致內存泄漏的問題眉睹。
protected Activity mActivity;
@Override
public void onAttach(Activity activity) {
super.onAttach(activity);
this.mActivity = activity;
}
代碼new 出來的VIew沒有ID
通常我們的VIew是通過布局文件依照@+id的方式在R文件中生成對映的一個Int值。這是用于運行時保證資源唯一性废膘。但有一種情況竹海,我們需要動態(tài)的在代碼中new出一個VIew來。如果一個VIew還好丐黄。多個view的時斋配,沒有id會導致你不方便持有一個引用。那么可以 View的generateViewId() 方法來生成 id灌闺,讓系統(tǒng)來保證唯一艰争。而不是用隨機數(shù)產生或者手寫一個具體的值。注:API17++
不傳遞的方式巧取context
context是我們經常用到的一個對象菩鲜,這里我們不深入的講解context园细,它的本質只是android組件的一個抽象接口,封裝了一些統(tǒng)一的標準方法接校。有興趣可以自己去查資料或翻閱源碼猛频。下面這張圖已經說明了。
下面提供一種思路通過VIew直接獲取context的api蛛勉。特別是適配器中鹿寻。別再傳遞這個對象了。注:從View上拿到的一定是Activity對象诽凌,但是如果你通過Service中或者Application中獲取的Context是不能用做操作View的毡熏。本質區(qū)別就是抽象方法和對象是無法保證你要操作的具體對象是你要的對象(這句話沒讀懂的多讀幾遍,慢點讀侣诵。說到底它就是依賴倒置原則問題)
View.getContext() //任何被創(chuàng)建的VIEW都持有了context對象
不使用handle回到主線程(即UI線程)
通常我們使用Activity.runOnUiThread在子線程完成邏輯后更新UI痢法。否則系統(tǒng)不會同意你在子線程中更新UI的。還有一種場景可以用下面的api
View.post(new Runnable() ) //同樣可以切回UI線程執(zhí)行杜顺。
當然現(xiàn)在Rxjava和EventBus可以完美的解決此類問題财搁。我更推薦Rxjava。
防止VIew上信息被其他軟件截屏或系統(tǒng)截圖泄漏信息
在某些特殊的場景下躬络,你的app可能和用戶隱私有關系尖奔。如果需求需要禁止截圖行為和覆蓋你當前的Acitivity行為,可以使用 如下API。
getWindow().addFlags(WindowManager.LayoutParams.FLAG_SECURE)
專制接二手渣渣項目快速看方法調用棧順序
我們可能因為跳槽提茁,或者其他原因接觸到了一個陌生的項目淹禾。可能它就是那種神才能看懂的代碼茴扁。有沒有辦法看某個方法到底是誰發(fā)起調用铃岔。都經過了什么過程呢?方法還是有的丹弱。如圖: one>tow>printStack德撬。我們需要找出printStack的調用順序铲咨。
//在最后你想看的方法中加入以下代碼躲胳,就可以神奇的在日志中打印出來方法調用順序
RuntimeException here = new RuntimeException("bolex");
here.fillInStackTrace();
Log.w("myTag", "Called: " + this, here);
嗯。今天就到這里爸纤勒,不是不是坯苹,是吧(? ̄?? ̄??)?。
如何下次找到我?
- 關注我的簡書
- 本篇同步Github倉庫:https://github.com/BolexLiu/DevNote (可以關注)