美團實習| 周記(一)

來實習公司有一周多了,從熟悉工作環(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的觸屏和鍵盤上“健步如飛”,看到隨隨便便一個分享都是英文文檔,都覺得自己還要很長的一段路要走,菜鳥也要努力飛翔??!

公司的福利月餅
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容