原创 OKHttp 3.10源碼解析(一):任務請求

OKhttp是目前Android端最熱門的網絡請求框架之一,它以高效的優點贏得了廣大開發者的喜愛,以下是OKhttp的主要特點: 1.支持HTTPS/HTTP2/WebSocket 2.內部維護線程池隊列,提高併發訪問的效率 3.內部維護

原创 Android自定義View(三) Matrix的原理解析

Matrix的中文是矩陣的意思,在Android中它起着座標映射、變換的功能。意思就是說我們在自定義view中,有時需要對圖表進行縮放、旋轉、轉移、錯切等操作,就需要對圖表的座標進行一定的轉換,此時就是Matrix在後臺起作用的。Matr

原创 Java數據結構和算法 (二) 二叉排序樹

一、二叉樹簡介 在數據結構中,對於有序數組來說查找很快,但是插入和刪除慢,因爲插入和刪除需要先找到指定的位置,後面所有的元素都要移動一個位置,爲插入騰出一個位置或補上被刪除的那個位置; 而對於鏈表來說,插入和刪除快,但是查找很慢,插入和刪

原创 關於HashMap中的hash算法

一、關於Hash表和Hash函數 Hash表也稱散列表,直譯爲哈希表,hash表是一種根據關鍵字值(key-value)而直接進行訪問的數據結構。在哈希表的鍵值對關係中,key到value中間還存在着一個映射值,這個映射值就是數組的下標i

原创 Android自定義View(四)Path之貝塞爾曲線

一、概述 1、貝賽爾曲線來源 在數學的數值分析領域中,貝賽爾曲線(Bézier曲線)是電腦圖形學中相當重要的參數曲線。更高維度的廣泛化貝塞爾曲線就稱作貝塞爾曲面,其中貝塞爾三角是一種特殊的實例 貝塞爾曲線於1962年,由法國工程師皮埃爾·

原创 RxJava 2.x 源碼分析(三) 變換操作符map和flatMap

RxJava的操作符有很多,一般常用的有變換操作符,其中最主要是map和flatMap,本文將分別來講解一下它們的實現原理。在上一篇文章:RxJava 2.x 源碼分析(二) 線程切換原理中,講到RxJava框架的執行流程,理解這個對我們

原创 Java數據結構和算法 (一) 哈希表

Hash表也稱散列表,直譯爲哈希表,hash表是一種根據關鍵字值(key-value)而直接進行訪問的數據結構。比如在基於數組的情況下,通過將關鍵字key映射到數組的某個下標來加快查找速度,這種起映射作用的函數我們稱之爲哈希函數 每種哈希

原创 Retrofit 2.0源碼解讀

Retrofit是基於OKhttp實現的網絡請求框架,是對OKhttp的優秀封裝,使用起來更加方便、簡潔,特別還提供了RxJava的支持。Retrofit框架中採用了大量的設計模式來實現超級解耦,所以本文的初衷希望通過Retrofit源碼

原创 Android NDK開發崩潰signal 11 (SIGSEGV), code 1 (SEGV_MAPERR) 的解決方法

一.前言 在NDK開發的過程中,如果遇到應用Crash,JNI層的報錯信息並不像java層那樣可以看到詳細的錯誤信息和錯誤位置,如果要想定位到錯誤位置,需要藉助NDK的一些工具進行地址轉換,本文中用addr2line(NDK的工具)來捕捉

原创 Android自定義View(二)View的事件分發機制

View的事件分發機制是Android中的一個難點,也是非常重要的知識點,充分理解和掌握事件分發機制有助於我們在自定義View的時候更好地分析和解決問題,下面我們就從源碼的角度來分析一下Android是怎麼處理View事件的 首先從整體上

原创 OKHttp 3.10源碼解析(四):連接機制

OKhttp的底層用的是Socket連接而不是URLConnection,所以整體來說還是比較複雜的,涉及到Http協議的封裝和解封裝、TLS/SSL安全協議的封裝、Http2的封裝等等,但還是非常值得我們去學習一下的,本篇文章不會對這些

原创 Android自定義View(一)View的測量

在Android中,一個View繪製出來要經過三大流程,第一是測量View的大小,第二是確定View的位置,第三是將View渲染到屏幕,本文將講解View的測量行爲,即如何確定View的大小 在View的測量過程中,首先介紹一個類Meas

原创 Recylerview網格佈局分割線(控件四邊也有分割線)

關於RecylerView分割線的問題,當佈局形式爲線性佈局LinearLayoutManager的時候, 官方提供了一個定義好的分割線類DividerItemDecoration,但是當佈局形式爲網格佈局GridLayoutManage

原创 深入理解Java多線程-synchronized的使用及其原理

線程安全是多線程編程中的一個重要的知識點,何爲線程安全?在多線程併發中,有很多數據是線程共享的,當我們某個線程去操作共享數據的時候,需要先將共享數據複製到當前線程的工作內存中來,然後操作完後再將數據更新到主存空間中去。這就造成了一個問題,

原创 深入理解Java多線程-線程池(ThreadPool)

在java多線程開發中,一般使用線程的時候都是創建一個Thread對象,然後調用start方法執行,這樣做沒有什麼問題,但是如果有多任務併發執行的時候,你可能需要頻繁地創建多個線程來執行任務,這樣會造成性能方面的問題,體現如下: 1.大量