原创 ImageView設置centerCrop的中心點

ImageView 設置CENTER_CROP的效果大家都很清楚,在實際業務中,我們可能不希望居中展示,那麼如何自定義中心點呢? 首先想到的是,查看setScaleType(ScaleType scaleType)支持的類型,看看能否支持擴

原创 Paging3 加載最後一頁,提示“沒有更多數據”功能

問題 使用 Paging3 處理分頁數據,如果需要在 RecyclerView 底部增加【加載更多】的提示,可以通過調用 PagingDataAdapter 的 withLoadStateFooter() 方法,向其底部添加 LoadSta

原创 實現 Paging3 加載最後一頁,提示沒有更多數據的功能

問題 使用 Paging3 處理分頁數據,如果需要在 RecyclerView 底部增加【加載更多】的提示,可以通過調用 PagingDataAdapter 的 withLoadStateFooter() 方法,向其底部添加 LoadSta

原创 Kotlin升級1.5.20 Room不能導出schemas

在 Kotlin 從1.5.10 升級到 1.5.20 時發現,Room不能導出 schemas 了,並且出現如下報錯: Schema export directory is not provided to the annotation p

原创 VFORK 掛掉的一個問題

在知乎上,有個人問了這樣的一個問題——爲什麼vfork的子進程裏用return,整個程序會掛掉,而且exit()不會?並給出瞭如下的代碼,下面的代碼一運行就掛掉了,但如果把子進程的return改成exit(0)就沒事。 我受邀後本來不想回答

原创 Android MediaProvider 掃描優化

本文以 Android 9.0 爲準 概述 在《Android MediaProvider》 這篇文章中分析了 MediaProvider 的源碼,不過當多個外部存儲設備,並且存儲大量文件時,MediaProvider 會存在掃描慢的情

原创 系統調用與內存管理(sbrk、brk、mmap、munmap)

一、系統調用(System Call): 在Linux中,4G內存可分爲兩部分——內核空間1G(3 ~ 4G)與用戶空間3G(0 ~ 3G),我們通常寫的C代碼都是在對用戶空間即0 ~ 3G的內存進行操作。而且,用戶空間的代碼不能直接訪問內

原创 使用 objdump -t 查看變量所處存儲位置

int aaa;// 未初始化的全局變量,bss區 int bbb = 0;// 初始化爲0的全局變量,bss區 int ccc = 1;// 初始化非0的全局變量,data區 int main() { static int ddd

原创 Linux中fork,vfork和clone詳解(區別與聯繫) clone, fork, vfork區別與聯繫

fork,vfork,clone Unix標準的複製進程的系統調用時fork(即分叉),但是Linux,BSD等操作系統並不止實現這一個,確切的說linux實現了三個,fork,vfork,clone(確切說vfork創造出來的是輕量級進程

原创 爲什麼兩次調用sbrk(0)會得出不同的值?

在學習函數 sbrk() 的時候,我們知道: void *sbrk (intptr_t increment); 當 increment 爲正時,則按 increment 的大小,開闢內存空間,並返回開闢前,程序中斷點(program b

原创 你真的知道匿名映射是什麼嗎?

在《認真分析mmap:是什麼 爲什麼 怎麼用》中提到了匿名映射,只要在 flags 參數中增加 MAP_ANONYMOUS,即爲匿名映射。此時,會忽略參數 fd,映射區不與任何文件關聯,而且映射區域無法和其他進程共享。 根據 mmap 映射

原创 怎麼理解Linux的中斷?

1. 什麼是中斷 中斷(interrupt)是指在CPU正常運行期間,由於內、外部事件引起的CPU暫時停止正在運行的程序,去執行該內部事件或外部事件引起的服務中去,服務完畢後再返回斷點處繼續執行的情形。這樣的中斷機制極大的提高了CPU運行效

原创 Linux系統內存管理與分頁機制

一、問題提出: 我們經常會使用malloc()以及free()函數進行堆區內存申請與釋放。那麼你是否會這樣做: int * p = malloc(0);// malloc分配了0個字節嗎,如果是那麼p指向誰呢,是NULL嗎? free(p)

原创 Kotlin高階函數之let、run、with、apply、also

這幾個都是 Standard.kt 中的高階函數,使用起來比較相似,容易混淆,下面就分析一下它們的區別和使用場景。 先看下不使用這些高階函數的例子: data class Person(val name: String, val age:

原创 讀懂Android項目中的Gradle

用了這麼久 AS,要是還是不明白 Gradle,真的說不過去。從網上下載一個項目跑不起來,Gradle 各種報錯束手無措,現在我們就整體看看這個 Gradle 到底是什麼,我這裏新建一個 Android 項目。 一、Project 中的 G