美團實習| 週記(一)

####來實習公司有一週多了,從熟悉工作環境到業務到參與項目這段時間,真的受益匪淺,get到很多新知識,也發現自己知識儲備上的不足,特此開一個專題“實習隨筆”來回顧每週的知識點和一些感悟,篇幅受限,只能簡單記錄,主要還是通過鏈接形式拓展和補充。本週知識清單:

  • Git、GitHub、Stash
  • MVP、MVVM模式
  • ConstraintLayout佈局
  • Tools命名空間
  • VideoView、SurfaceView、TextureView
  • 一些小感悟

1.Git、GitHub、Stash

以前做項目託管代碼時,選擇的是GitHub開源平臺,因爲在AndroidStudio中有很好的集成了這一功能,只需要通過點擊VCS選項卡下Git的幾個命令即可,具體操作詳見AS中Git與GitHub的使用入門,所以並沒有用過Git命令,但在公司發現大家更喜歡直接在AS終端下手寫命令行,所以瞭解Git以及常用的幾個指令還是很有必要的。

a. Git 工作流程

Workspace(工作區):當前開發位置

  • git pull:從遠程倉庫拉取最新代碼到工作區,相當於git fetch+git merge
  • git diff:查看修改但未暫存的文件

Index (暫存區):

  • git add:工作區修改的內容提交到暫存區,交由Git管理
  • git status:查看暫存區文件狀態

Repository(本地倉庫)

  • git commit:將暫存區的內容提交到本地倉庫
  • git clone 或者 git fetch:從遠程倉庫拷貝/拉取代碼到本地倉庫

Remote(遠程倉庫)

  • git push:將本地倉庫的內容提交到遠程倉庫

b.常用Git指令:

幾點強調

(1)撤銷git reset,與git revert的區別見圖:

可見,git reset是直接刪除指定的commit,git revert是用一次新的commit來回滾之前的commit。

(2)分支git branch,關於Git分支那點事兒 以及實戰

  • master(主分支):用於正式發佈
  • develop(開發分支):用於日常開發。注意新的分支應基於develop分支,而不是master分支。
  • release(預發佈分佈):用於預發佈測試
  • hotfix(維護分支):用於線上版本bug修復

(3)合併git merge,與git rebase的區別是:git merge會生成一個新的節點,並將之前的提交分開顯示;git rebase操作不會生成新的節點,而是將兩個分支融合成一個線性的提交。如例子:

       D---E test
     /
A---B---C---F master

git merge結果如下:

      D--------E
     /          \
A---B---C---F----G   test, master

git rebase結果如下:

A---B---D---E---C'---F'   test, master

(4)歷史提交git log

c.文件顏色含義:

  • 白色:加入版本控制、已提交、未改動
  • 藍色:加入版本控制、已提交、有改動
  • 綠色:加入版本控制、未提交
  • 紅色:未加入版本控制
  • 灰色:版本控制已忽略

圖片來源:一篇文章,教你學會Git

d.Stash是一款強大的企業級Git代碼庫管理工具,實習公司所用的版本控制工具就是Stash,以下展示的是如何使用Mac從Stash下載代碼。

(1)如果沒有密鑰對,先生成密鑰對

(2)登錄Stash系統後, 進入個人賬戶管理界面(右上角頭像)。然後在左側選擇 “SSH keys” ,可以看到自己上傳過的公鑰列表。點擊"Add key"添加自己的公鑰。

注意:

  • 上傳了SSH keys纔可以使用倉庫的SSH地址, 而且驗證身份時無需輸入密碼比較方便。
  • 可以上傳多個公鑰。

(3)Stash支持私人倉庫,創建一個自己的倉庫,或者通過fork別人的倉庫。
(4)進入到倉庫的瀏覽頁面, 點擊Clone, 拷貝SSH訪問地址 。

(5)在本地創建文件夾用於存放要拷貝的代碼,在終端用cd進入之後,使用命令“git clone +SSH地址” 完成代碼的拷貝。


2.MVP、MVVM模式

隨着項目越來越複雜,爲了減輕MVC模式裏Activity過於臃腫,現在企業項目多應用MVP和MVVM模式。下圖是MVC → MVP → MVVM的演進過程。

a.MVP模式

(1)含義

  • Model:數據層,負責存儲、檢索、操縱數據。
  • View:UI層,顯示數據,並向Presenter報告用戶行爲。
  • Presenter:作爲View與Model交互的中間紐帶,從Model拿數據,應用到UI層,管理UI的狀態,響應用戶的行爲。

(2)相比於MVC的優勢

  • 分離了視圖邏輯和業務邏輯,降低了耦合。
  • Activity只處理生命週期的任務,代碼變得更加簡潔
  • 視圖邏輯和業務邏輯分別抽象到了View和Presenter的接口中去,提高代碼的可閱讀性。
  • Presenter被抽象成接口,可以有多種具體的實現,所以方便進行單元測試
  • 把業務邏輯抽到Presenter中去,避免後臺線程引用着Activity導致Activity的資源無法被系統回收從而引起內存泄露和OOM。

(3)理解MVP必不可少要對官方Google給出的的todo-mvp示例進行學習,推薦閱讀從google todo-mvp示例再次學習MVP

(4)使用MVP最簡單一個應用方法

  • 定義相應Model等數據類;
  • 定義IPresenter接口,包含有關控制的抽象方法,注意爲了避免由於持有view而引起的內存泄露,要有release()方法去釋放view;
  • 定義IView接口,包含和UI變化相關的一些抽象方法;
  • 實現IPresenter接口,重寫抽象方法,幷包含一個對IView實現對象的引用;
  • 在Activity裏的onCreate() 中使用方法initView()綁定UI、initData()獲取並顯示初始數據,並實現IView接口,重寫抽象方法。

應用實例最適合android的MVP模式

b.MVVM模式

MVVM的目標和思想與MVP類似,利用數據綁定(Data Binding)、依賴屬性(Dependency Property)、命令(Command)、路由事件(Routed Event)等新特性,打造了一個更加靈活高效的架構。

在常規的開發模式中,數據變化需要更新UI的時候,需要先獲取UI控件的引用,然後再更新UI,獲取用戶的輸入和操作也需要通過UI控件的引用,但在MVVM中,這些都是通過數據驅動來自動完成的,數據變化後會自動更新UI,UI的改變也能自動反饋到數據層,數據成爲主導因素。這樣MVVM層在業務邏輯處理中只要關心數據,不需要直接和UI打交道,在業務處理過程中簡單方便很多。

推薦閱讀如何構建Android MVVM應用程序

c.在文章MVP模式是你的救命稻草嗎?中有一段話我覺得很在理,原文如下:

“無論MVP或MVC還是MVVM等任何一種架構和模式其實都沒有誰優誰劣之分,而且就算是同一種架構,也可以根據不同的使用場景來做不同的實現方式,這裏並沒有宇宙絕對的對錯標準和概念定義。目前市面上的架構模式已經有很多種,各有不同,但模式終究只是一種設計理念的表現形式,學習再多的架構,你也只是多會用了幾種工具而已,學習一種模式其實是在學一種思維方式:如何在解決問題的時候把問題合理的拆分,又如何將拆分的零件合理的組裝成解決問題的工具。”


3.ConstraintLayout佈局

ConstraintLayout佈局和之前出現的集中佈局不同的是,它非常適合使用可視化的方式來編寫界面,而不是推薦使用XML的方式來進行編寫。這是谷歌官方文檔的介紹

而且自Android Studio升級2.2之後,默認生成的XML佈局已經從原來的RelativeLayout替換爲ConstraintLayout,可見谷歌的重視,當然不過不多用肯定是會不習慣的,這裏有詳細解析以及動畫效果Android新特性介紹,ConstraintLayout完全解析,一起來動動手試試看吧。


4.Tools命名空間

小小的Tools命名空間xmlns:tools="http://schemas.android.com/tools"其實大有文章,是個很值得學用的小技能。這裏是英文版介紹,下面介紹幾個常用的。

a.錯誤處理屬性tools:targetApi:指明某個控件只在指定的API 及更高的版本中生效,避免在使用Lint檢測時因爲minSdkVersion低於控件出現的版本而報錯。

<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:layouttools:listitemtools: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.資源篩減屬性:允許啓用嚴格關聯檢測並且決定在項目構建的時候是否保留或丟棄指定的資源文件。

<?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實現視頻播放主要是使用VideoView類來實現的,但是VideoView會產生一些很令人頭疼的問題,從其父類SurfaceView遺留下來的,比如短暫黑屏,網上有一些解決辦法,但最好的辦法是使用TextureView替換SurfaceView實現VideoView。

這裏可以理解VideoView是由MediaPlayer + SurfaceView封裝而成的。其中MediaPlayer用於播放音頻,SurfaceView用於提供圖像輸出界面。

SurfaceView原理:在現有View上創建一個新的Window來顯示和渲染內容,並不會顯示在View上,因此SurfaceView的顯示不受View的屬性控制,不能進行平移,縮放等變換,也不能放在其它RecyclerView或ScrollView中,一些View中的特性也無法使用。

TextureView類是在Android4.0中引入的,與SurfaceView相比,它不會創建新的窗口來顯示內容。而是將內容流直接投放到View中,並且可以和其它普通View一樣進行移動、旋轉、縮放、動畫等變化。TextureView的使用也很簡單,推薦閱讀Android TextureView簡易教程


6.一些小感悟

比較幸運,加入的是一個比較新的項目組,有幸參與了全程的開發週期,從需求評審到技術評審到開發到埋點,馬上也要聯調和測試了,接觸到的對象有產品、美工、測試和後臺等等,每一個會議每一份文檔我都是第一次見識,除了好奇之外,同時也感受到了大公司項目開發流程的規範。這是我們自己做小項目的時候無法感觸到的。

美團給技術類實習生分配的設備都是Mac,還有大屏顯示器說是可以去申請,加上人體工學椅這三件套足以羨煞旁人了,作爲一個Android開發第一次接觸mac,雖然不太熟練,但是很快被mac的速度、簡潔、輕盈和外觀所吸引了,體驗甚好。

另外,美團果然如外界所說很重視實習生的培養和發展,雖然我們的項目很新,團隊也是今年剛剛組建的,內部建設不如外賣等成熟業務完善,但是加入這個團隊一點也不會覺得難以融入,小夥伴都是很nice的很牛逼的大佬,導師和leader會經常通過談話和答疑解惑的方式,來關注實習生動向和學習進度,可以說非常感謝他們耐心引領。

而且美團的“互聯網+大學”還推出很多針對實習生和應屆生的課程。在美團,分享會、培訓課堂是無處不在的,強大的wiki知識庫也會讓人大飽眼福,如果獲取到一定權限,你想了解的美團旗下各種APP的源碼也會信手拈來。

最後還是不斷提升自己吧,看着大佬們在mac的觸屏和鍵盤上“健步如飛”,看到隨隨便便一個分享都是英文文檔,都覺得自己還要很長的一段路要走,菜鳥也要努力飛翔啊!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章