筆記
記憶力不是很好,特別是對于一些用不上的知識。但好像人有一個(gè)遺忘曲線,所以利用B站服務(wù)器做一個(gè)記錄和整理(云服務(wù)器很貴的,而且老有些無聊的人喜歡爆破SSH和CMS密碼)。
Flow
我沒用過RxJava,以前都是手動(dòng)實(shí)現(xiàn)的用于UI更新的觀察者模式和生命周期管理,對于“事件訂閱”也沒什么概念,類似的需求都是直接開線程然后用Handle?Message那一套做UI更新......后來才知道Jetpack,然后知道有ViewModel和LiveData,然后稍微用過一下。
因?yàn)橹坝腥税袴low和LiveData做了比較,就先入為主的認(rèn)為這兩個(gè)東西等價(jià)了,這是錯(cuò)的。
還沒完全摸清楚Flow的門道,但對于Flow的定位差不多有一些了解了:
Flow和LiveData一樣,是一個(gè)可觀察的數(shù)據(jù)容器。同時(shí),F(xiàn)low可以在不知道具體數(shù)據(jù)的前提下對數(shù)據(jù)進(jìn)行處理,而LiveData不行。
另外,F(xiàn)low其實(shí)牽扯到了如何去獲取數(shù)據(jù),雖然它不關(guān)心數(shù)據(jù)是怎么來的(從數(shù)據(jù)庫或網(wǎng)絡(luò),或者SP),但Flow承擔(dān)了生產(chǎn)數(shù)據(jù)的任務(wù),并不是單純的數(shù)據(jù)的容器。
所以對于Flow的使用場景:我發(fā)現(xiàn)B站視頻播放頁面的點(diǎn)贊數(shù)是會實(shí)時(shí)改變的,盲猜背后是定時(shí)從服務(wù)器拿到新的點(diǎn)贊數(shù)。這種時(shí)候Flow就比LiveData合適,同樣是可觀察的數(shù)據(jù)容器,但Flow可以在觀察者(消費(fèi)者)獲取(收集)數(shù)據(jù)時(shí)自己去生產(chǎn)數(shù)據(jù),比如上面的例子,用Flow實(shí)現(xiàn)就是:
private val likeCount= flow<Int> { ? ? ? ? ?while (true){ ? ? ? ? ? ? emit(getLikeCount()) ? ? ? ? ? ? delay(1000) ? ? ? ? } ? ? }
當(dāng)別的類要用到likeCount更新UI的時(shí)候,只需要觀察(收集)likeCount就行了。likeCount就會每隔一秒就去獲取一次最新點(diǎn)贊數(shù),不需要再在別的地方開線程更新它的值。
這個(gè)likeCount的值是沒辦法手動(dòng)改變的,所以Flow適合的場景是,數(shù)據(jù)會自動(dòng)產(chǎn)生并更新的情況。有些時(shí)候數(shù)據(jù)是由用戶產(chǎn)生,而且是由用戶的行為更新的,比如文件管理器,當(dāng)前目錄的文件,是用戶點(diǎn)擊某個(gè)文件夾數(shù)據(jù)才會變......這種時(shí)候就沒必要用Flow,直接LiveData或者M(jìn)utableStateFlow。
對于官方說的數(shù)據(jù)流,還有“生產(chǎn)者”?“中間商” “消費(fèi)者”之類的概念,我還是有點(diǎn)暈,所以就按自己的理解先用著。另外還有Flow基于協(xié)程帶來的一些,諸如可以避免內(nèi)存泄漏(不知道當(dāng)一個(gè)Activity被銷毀,而它開的線程還在從服務(wù)器獲取數(shù)據(jù)的情況,算不算內(nèi)存泄漏)之類的好處,就不談了。
總之,F(xiàn)low就是一個(gè)可以自己決定如何產(chǎn)生數(shù)據(jù)的,可觀察的數(shù)據(jù)容器。
目的還是服務(wù)于MVVM模式,讓UI壓根不需要關(guān)心數(shù)據(jù)從哪來,怎么更新,而只關(guān)心怎么展示數(shù)據(jù)。
2.Compose雜項(xiàng)
我還是太年輕了。Compose的水不是一般的深,根本就沒有表面上那么簡單,那么輕量級。
但Compose還是比View體系效率(開發(fā)效率和運(yùn)行效率)更高,而且更符合直覺。我初學(xué)安卓的時(shí)候就覺得setText只要調(diào)用一次,TextView里面的文字就應(yīng)該隨著變量改變,每次都要設(shè)置就很奇怪。所以Compose比View更適合沒寫過xml的初學(xué)者。
效率更高,更容易入門,缺的就只有生態(tài)。Compose應(yīng)該會在未來成為主流,值得賭一手。
話是這么說,但很多東西還沒完全弄明白,先留空。
-1.你有必要成為專家
最初學(xué)的安卓,然后學(xué)了一段時(shí)間的游戲開發(fā),又學(xué)了點(diǎn)逆向,黑客技術(shù),還有后端。
基本都是蜻蜓點(diǎn)水。是一拍腦袋做的決定。
當(dāng)時(shí)是看了點(diǎn)SQL注入的教程,就拿B站用戶信息的界面試了下,當(dāng)然是沒用的。我知道肯定不行,但我想知道為什么不行,于是就看了更多的SQL注入的教程,依舊沒得到答案。
直到我需要做后端,用了Springboot和Mybatis,才知道有個(gè)東西叫“預(yù)編譯”。
說實(shí)話,SQL注入這種東西基本已經(jīng)死透了,但是你去搜黑客教程,依舊是SQL注入起手。
這件事告訴我們什么道理呢?
1.在逆向以前首先要懂正向。
首先發(fā)現(xiàn)SQL注入的人肯定是個(gè)做后端的,在知道后端怎么運(yùn)作的基礎(chǔ)上,才有可能發(fā)現(xiàn)SQL注入。
后端都不懂就擱那注入,盲人摸象了屬于是。
2.真理要靠自己去尋找
為什么現(xiàn)在的網(wǎng)站注不進(jìn)去,如果我沒學(xué)后端估計(jì)到現(xiàn)在還是懵的。所以指望從別人口中得到答案,基本是妄想。
以前覺得我只能去做逆向了,其實(shí)挺搞笑的。
事情沒有那么復(fù)雜,我要做的事只有一件:
在某個(gè)領(lǐng)域成為專家。
這次是真的悟了,發(fā)自內(nèi)心的。其實(shí)“高考”完以后,我就已經(jīng)沒有任何目標(biāo)了,就這樣一直渾渾噩噩混日子,偶爾努力一下,很快又會懷疑努力的盡頭到底有什么。
沒有必要思考那么多其實(shí)。什么學(xué)歷,風(fēng)口都是假的,首先是要成為專家,在這個(gè)基礎(chǔ)上一切都會變得簡單。
我有點(diǎn)過于輕視在職程序員了,覺得自己差的只是一個(gè)985的學(xué)歷,以及面試的那些八股文,還有諸如熱修復(fù),組件化,依賴注入之類自己用的少的東西。
實(shí)際上不管用不用得上,能夠做到的人才配被稱作專家。畢竟即使強(qiáng)如Faker,在不打游戲的人眼里也就是一個(gè)愣頭青,和同樣20多歲的青銅病友并沒有什么區(qū)別。
就是說,我并不能觀測到別人腦袋里到底有多少知識,即使一個(gè)同領(lǐng)域的專家站在我面前我也不會覺得它有任何與眾不同。
成為專家以后的我,并不會在頭上頂著一個(gè)專家的稱號,我在別人眼里還是和以前一樣。
這應(yīng)該就是:“智者向內(nèi)尋求力量吧?!?/p>
原本及其簡單,原本應(yīng)該明白的事,卻在看過太多冠冕堂皇的東西以后忘記了。
沒什么好說的了。成為專家吧。