來實習公司有一周多了,從熟悉工作環(huán)境到業(yè)務(wù)到參與項目這段時間,真的受益匪淺,get到很多新知識,也發(fā)現(xiàn)自己知識儲備上的不足,特此開一個專題“實習隨筆”來回顧每周的知識點和一些感悟,篇幅受限,只能簡單記錄,主要還是通過鏈接形式拓展和補充。本周知識清單:
- Git、GitHub、Stash
- MVP、MVVM模式
- ConstraintLayout布局
- Tools命名空間
- VideoView、SurfaceView、TextureView
- 一些小感悟
1.Git、GitHub、Stash
以前做項目托管代碼時,選擇的是GitHub開源平臺,因為在AndroidStudio中有很好的集成了這一功能,只需要通過點擊VCS選項卡下Git的幾個命令即可,具體操作詳見AS中Git與GitHub的使用入門、如何用AndroidStudio導入github項目,所以并沒有用過Git命令,但在公司發(fā)現(xiàn)大家更喜歡直接在AS終端下手寫命令行,所以了解Git以及常用的幾個指令還是很有必要的。
a. Git 工作流程:
Workspace(工作區(qū)):當前開發(fā)位置
-
git pull:從遠程倉庫拉取最新代碼到工作區(qū),相當于git fetch+git merge -
git diff:查看修改但未暫存的文件
Index (暫存區(qū)):
-
git add:工作區(qū)修改的內(nèi)容提交到暫存區(qū),交由Git管理 -
git status:查看暫存區(qū)文件狀態(tài)
Repository(本地倉庫)
-
git commit:將暫存區(qū)的內(nèi)容提交到本地倉庫 -
git clone或者git fetch:從遠程倉庫拷貝/拉取代碼到本地倉庫
Remote(遠程倉庫)
-
git push:將本地倉庫的內(nèi)容提交到遠程倉庫
b.常用Git指令:
幾點強調(diào):
(1)撤銷git reset,與git revert的區(qū)別見圖:
可見,git reset是直接刪除指定的commit,git revert是用一次新的commit來回滾之前的commit。
(2)分支git branch,關(guān)于Git分支那點事兒 以及實戰(zhàn)
- master(主分支):用于正式發(fā)布
- develop(開發(fā)分支):用于日常開發(fā)。注意新的分支應(yīng)基于develop分支,而不是master分支。
- release(預發(fā)布分布):用于預發(fā)布測試
- hotfix(維護分支):用于線上版本bug修復
(3)合并git merge,與git rebase的區(qū)別是:git merge會生成一個新的節(jié)點,并將之前的提交分開顯示;git rebase操作不會生成新的節(jié)點,而是將兩個分支融合成一個線性的提交。如例子:
D---E test
/
A---B---C---F master
git merge結(jié)果如下:
D--------E
/ \
A---B---C---F----G test, master
git rebase結(jié)果如下:
A---B---D---E---C'---F' test, master
(4)歷史提交git log
c.文件顏色含義:
- 白色:加入版本控制、已提交、未改動
- 藍色:加入版本控制、已提交、有改動
- 綠色:加入版本控制、未提交
- 紅色:未加入版本控制
- 灰色:版本控制已忽略
圖片來源:一篇文章,教你學會Git
d.Stash是一款強大的企業(yè)級Git代碼庫管理工具,實習公司所用的版本控制工具就是Stash,以下展示的是如何使用Mac從Stash下載代碼。
(1)如果沒有密鑰對,先生成密鑰對。
(2)登錄Stash系統(tǒng)后, 進入個人賬戶管理界面(右上角頭像)。然后在左側(cè)選擇 "SSH keys" ,可以看到自己上傳過的公鑰列表。點擊"Add key"添加自己的公鑰。
注意:
- 上傳了SSH keys才可以使用倉庫的SSH地址, 而且驗證身份時無需輸入密碼比較方便。
- 可以上傳多個公鑰。
(3)Stash支持私人倉庫,創(chuàng)建一個自己的倉庫,或者通過fork別人的倉庫。
(4)進入到倉庫的瀏覽頁面, 點擊Clone, 拷貝SSH訪問地址 。
(5)在本地創(chuàng)建文件夾用于存放要拷貝的代碼,在終端用cd進入之后,使用命令“git clone +SSH地址” 完成代碼的拷貝。
2.MVP、MVVM模式
隨著項目越來越復雜,為了減輕MVC模式里Activity過于臃腫,現(xiàn)在企業(yè)項目多應(yīng)用MVP和MVVM模式。下圖是MVC → MVP → MVVM的演進過程。
a.MVP模式
(1)含義:
- Model:數(shù)據(jù)層,負責存儲、檢索、操縱數(shù)據(jù)。
- View:UI層,顯示數(shù)據(jù),并向Presenter報告用戶行為。
- Presenter:作為View與Model交互的中間紐帶,從Model拿數(shù)據(jù),應(yīng)用到UI層,管理UI的狀態(tài),響應(yīng)用戶的行為。
(2)相比于MVC的優(yōu)勢:
- 分離了視圖邏輯和業(yè)務(wù)邏輯,降低了耦合。
- Activity只處理生命周期的任務(wù),代碼變得更加簡潔。
- 視圖邏輯和業(yè)務(wù)邏輯分別抽象到了View和Presenter的接口中去,提高代碼的可閱讀性。
- Presenter被抽象成接口,可以有多種具體的實現(xiàn),所以方便進行單元測試。
- 把業(yè)務(wù)邏輯抽到Presenter中去,避免后臺線程引用著Activity導致Activity的資源無法被系統(tǒng)回收從而引起內(nèi)存泄露和OOM。
(3)理解MVP必不可少要對官方Google給出的的todo-mvp示例進行學習,推薦閱讀從google todo-mvp示例再次學習MVP。
(4)使用MVP最簡單一個應(yīng)用方法:
- 定義相應(yīng)Model等數(shù)據(jù)類;
- 定義IPresenter接口,包含有關(guān)控制的抽象方法,注意為了避免由于持有view而引起的內(nèi)存泄露,要有
release()方法去釋放view; - 定義IView接口,包含和UI變化相關(guān)的一些抽象方法;
- 實現(xiàn)IPresenter接口,重寫抽象方法,并包含一個對IView實現(xiàn)對象的引用;
- 在Activity里的
onCreate()中使用方法initView()綁定UI、initData()獲取并顯示初始數(shù)據(jù),并實現(xiàn)IView接口,重寫抽象方法。
應(yīng)用實例:最適合android的MVP模式
b.MVVM模式
MVVM的目標和思想與MVP類似,利用數(shù)據(jù)綁定(Data Binding)、依賴屬性(Dependency Property)、命令(Command)、路由事件(Routed Event)等新特性,打造了一個更加靈活高效的架構(gòu)。
在常規(guī)的開發(fā)模式中,數(shù)據(jù)變化需要更新UI的時候,需要先獲取UI控件的引用,然后再更新UI,獲取用戶的輸入和操作也需要通過UI控件的引用,但在MVVM中,這些都是通過數(shù)據(jù)驅(qū)動來自動完成的,數(shù)據(jù)變化后會自動更新UI,UI的改變也能自動反饋到數(shù)據(jù)層,數(shù)據(jù)成為主導因素。這樣MVVM層在業(yè)務(wù)邏輯處理中只要關(guān)心數(shù)據(jù),不需要直接和UI打交道,在業(yè)務(wù)處理過程中簡單方便很多。
推薦閱讀:如何構(gòu)建Android MVVM應(yīng)用程序
c.在文章MVP模式是你的救命稻草嗎?中有一段話我覺得很在理,原文如下:
“無論MVP或MVC還是MVVM等任何一種架構(gòu)和模式其實都沒有誰優(yōu)誰劣之分,而且就算是同一種架構(gòu),也可以根據(jù)不同的使用場景來做不同的實現(xiàn)方式,這里并沒有宇宙絕對的對錯標準和概念定義。目前市面上的架構(gòu)模式已經(jīng)有很多種,各有不同,但模式終究只是一種設(shè)計理念的表現(xiàn)形式,學習再多的架構(gòu),你也只是多會用了幾種工具而已,學習一種模式其實是在學一種思維方式:如何在解決問題的時候把問題合理的拆分,又如何將拆分的零件合理的組裝成解決問題的工具。”
3.ConstraintLayout布局
ConstraintLayout布局和之前出現(xiàn)的集中布局不同的是,它非常適合使用可視化的方式來編寫界面,而不是推薦使用XML的方式來進行編寫。這是谷歌官方文檔的介紹。
而且自Android Studio升級2.2之后,默認生成的XML布局已經(jīng)從原來的RelativeLayout替換為ConstraintLayout,可見谷歌的重視,當然不過不多用肯定是會不習慣的,這里有詳細解析以及動畫效果Android新特性介紹,ConstraintLayout完全解析,一起來動動手試試看吧。
4.Tools命名空間
小小的Tools命名空間xmlns:tools="http://schemas.android.com/tools"其實大有文章,是個很值得學用的小技能。這里是英文版介紹,下面介紹幾個常用的。
a.錯誤處理屬性tools:targetApi:指明某個控件只在指定的API 及更高的版本中生效,避免在使用Lint檢測時因為minSdkVersion低于控件出現(xiàn)的版本而報錯。
<android.support.constraint.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
tools:targetApi="22">
b.預覽屬性tools:layout、tools:listitem、 tools:menu等等,幫助快速預覽布局展示效果。
<android.support.v7.widget.RecyclerView xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:id="@android:id/list"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:listitem="@layout/item_list"/>
c.資源篩減屬性:允許啟用嚴格關(guān)聯(lián)檢測并且決定在項目構(gòu)建的時候是否保留或丟棄指定的資源文件。
<?xml version="1.0" encoding="utf-8"?>
<resources xmlns:tools="http://schemas.android.com/tools"
tools:keep="@layout/used_1,@layout/used_2,@layout/*_3"
tools:discard="@layout/unused_1" />
推薦閱讀:Android:Tools命名空間原來是有大用處的
5.VideoView、SurfaceView、TextureView
Android實現(xiàn)視頻播放主要是使用VideoView類來實現(xiàn)的,但是VideoView會產(chǎn)生一些很令人頭疼的問題,從其父類SurfaceView遺留下來的,比如短暫黑屏,網(wǎng)上有一些解決辦法,但最好的辦法是使用TextureView替換SurfaceView實現(xiàn)VideoView。
這里可以理解VideoView是由MediaPlayer + SurfaceView封裝而成的。其中MediaPlayer用于播放音頻,SurfaceView用于提供圖像輸出界面。
SurfaceView原理:在現(xiàn)有View上創(chuàng)建一個新的Window來顯示和渲染內(nèi)容,并不會顯示在View上,因此SurfaceView的顯示不受View的屬性控制,不能進行平移,縮放等變換,也不能放在其它RecyclerView或ScrollView中,一些View中的特性也無法使用。
TextureView類是在Android4.0中引入的,與SurfaceView相比,它不會創(chuàng)建新的窗口來顯示內(nèi)容。而是將內(nèi)容流直接投放到View中,并且可以和其它普通View一樣進行移動、旋轉(zhuǎn)、縮放、動畫等變化。TextureView的使用也很簡單,推薦閱讀Android TextureView簡易教程。
6.一些小感悟
比較幸運,加入的是一個比較新的項目組,有幸參與了全程的開發(fā)周期,從需求評審到技術(shù)評審到開發(fā)到埋點,馬上也要聯(lián)調(diào)和測試了,接觸到的對象有產(chǎn)品、美工、測試和后臺等等,每一個會議每一份文檔我都是第一次見識,除了好奇之外,同時也感受到了大公司項目開發(fā)流程的規(guī)范。這是我們自己做小項目的時候無法感觸到的。
美團給技術(shù)類實習生分配的設(shè)備都是Mac,還有大屏顯示器說是可以去申請,加上人體工學椅這三件套足以羨煞旁人了,作為一個Android開發(fā)第一次接觸Mac,雖然不太熟練,但是很快被Mac的速度、簡潔、輕盈和外觀所吸引了,體驗甚好。
另外,美團果然如外界所說很重視實習生的培養(yǎng)和發(fā)展,雖然我們的項目很新,團隊也是今年剛剛組建的,內(nèi)部建設(shè)不如外賣等成熟業(yè)務(wù)完善,但是加入這個團隊一點也不會覺得難以融入,小伙伴都是很nice的很牛逼的大佬,導師和leader會經(jīng)常通過談話和答疑解惑的方式,來關(guān)注實習生動向和學習進度,可以說非常感謝他們耐心引領(lǐng)。
而且美團的“互聯(lián)網(wǎng)+大學”還推出很多針對實習生和應(yīng)屆生的課程。在美團,分享會、培訓課堂是無處不在的,強大的wiki知識庫也會讓人大飽眼福,如果獲取到一定權(quán)限,你想了解的美團旗下各種APP的源碼也會信手拈來。
最后還是不斷提升自己吧,看著大佬們在Mac的觸屏和鍵盤上“健步如飛”,看到隨隨便便一個分享都是英文文檔,都覺得自己還要很長的一段路要走,菜鳥也要努力飛翔??!
