原创 Instant Run導致ClassNotFoundException

最近一個項目運行時出現了ClassNotFoundException,感覺有點像是64k問題,但很快排除了。 而此處這個問題是apk文件在經過某種簽名後纔有,沒有這種簽名就不會出現。 最後關閉了AS中的Instant Run,重新

原创 【源碼分析】Android觸摸事件的分發攔截

Android中View的分發攔截機制是一塊重要的內容,網上也有很多大神進行過相關的分析。 在這篇文章裏我將以自己的理解儘量全面地分析整個流程,有些分析結果是很多文章沒有提及的。 整個分析過程將通過demo與源碼進行,做到有理有據

原创 開源項目【WanAndroid-MVVM】玩安卓 Kotlin 版 (MVVM 架構)

WanAndroid-MVVM 玩 Android 客戶端,採用 kotlin 語言,Material Design 風格,根據 MVVM 架構使用 Jetpack 架構組件搭建了整套框架 持續更新ing~ 技術分析請看 MVVM

原创 【源碼分析】CountDownTimer倒計時爲何如此優雅

CountDownTimer是一個抽象類,它有兩個抽象方法需要調用者去實現。 我們可以直接以匿名類形式使用: new CountDownTimer(50 * 1000, 2 * 1000) { @Ove

原创 okhttp 3.4.2 攔截器使用總結

16年寫過一篇RxJava+Retrofit+OkHttp組合在網絡請求中的簡單配置,本篇文章可以當作對它的補充。 okhttp攔截器作爲它的重要一員,如果好好利用往往能使我們事半功倍,先看一下攔截器的核心接口Intercepto

原创 Android設備的藍牙通信

設置藍牙 我們都知道,在手機的設置-藍牙中,可以進行藍牙設置的相關操作。 其實可以不離開自己的APP,直接完成藍牙設置的主要操作,可以結合自己的業務需求,相應地提示用戶開啓相關設置,提升用戶體驗。 首先要知道,藍牙連接需要知道待連

原创 Android中線程的那些關係

去年畫了張圖,總結了一下Android中線程涉及到的一些方面,本來還想着寫幾篇博客分析的,奈何實在是精力有限,一直沒寫下去,估計以後也沒精力寫這個主題的文章了。 今天是農曆新年,是時候把這個坑填回去了,就貼出我總結的圖吧。 如有錯

原创 【源碼分析】走進EventBus

簡介 EventBus被廣泛用於Android組件之間的通訊,源碼點這裏,當前的最新版本爲3.0.0,該版本發佈於2016.02.05。 它的大致原理如下圖: 根據官方的描述,它具有輕巧快速、解耦事件發送者和接收者、在各組

原创 神奇的Python裝飾器

在代碼運行期間動態增加功能的方式,稱之爲“裝飾器”(Decorator)。 Python裝飾器接收一個函數,返回另一個函數。它其實是一個閉包(嵌套定義在非全局作用域裏面的函數能夠記住它在被定義的時候它所處的封閉命名空間),閉包的作

原创 開源庫【GuideView】功能引導視圖,支持fragment,只顯示一次,接入超簡單順滑

###寫在前面 其實已經有很多類似的開源庫,比較滿意的是這個庫:https://github.com/qiushi123/GuideView-master,但它實現的效果和使用方式不是很6,本來是想對這個庫提交PR,但發現改動有點

原创 【源碼分析】RxJava 1.2.2 實現簡單事件流的原理

目前RxJava已經被廣泛用於Android開發中,GitHub地址在這,官方文檔說2018.03.31停止維護1.x 版本,本篇文章基於RxJava 1.2.2。 關於RxJava的介紹文章推薦看扔物線的給 Android 開發

原创 List的add方法隱藏的坑

在一個List中add()了一個對象後,之後再沒有改變這個List,某個時間點取出List中的數據, 卻發現取出的數據已經發生了變化。 這個bug排查了好久,才發現是因爲當初add的對象在別的類中被改變了! 這就是List的add

原创 深入認識adb工具

前言 官方文檔 本篇文章是對官方文檔的理解和總結,大部分內容來自官方文檔。 adb即Android 調試橋,是一個通用命令行工具,其允許我們與模擬器實例或連接的 Android 設備進行通信。 和Git、MySQL等一樣,adb也

原创 藍牙通信之保證數據的完整性

由來 之前寫過一篇Android藍牙通信的文章,介紹了Android藍牙的使用和一款藍牙聊天app的原理,可以點這裏看這篇文章。 本篇文章是對上篇文章的完善和補充。 原有問題 上篇文章在分析藍牙聊天app時提到過“管理連接線程”,

原创 Android 混淆 (不定期完善第三方混淆規則)

開啓混淆 在AS中,藉助於SDK中自帶的Proguard工具,開啓混淆只需要在release閉包中添加如下兩行代碼: release { minifyEnabled true