美團實習| 週記(一)

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

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

1.Git、GitHub、Stashhtml

之前作項目託管代碼時,選擇的是GitHub開源平臺,由於在AndroidStudio中有很好的集成了這一功能,只須要經過點擊VCS選項卡下Git的幾個命令便可,具體操做詳見AS中Git與GitHub的使用入門如何用AndroidStudio導入github項目,因此並無用過Git命令,但在公司發現你們更喜歡直接在AS終端下手寫命令行,因此瞭解Git以及經常使用的幾個指令仍是頗有必要的。python

a. Git 工做流程android

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

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

Index (暫存區):github

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

Repository(本地倉庫)android-studio

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

Remote(遠程倉庫)bash

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

b.經常使用Git指令:架構

幾點強調ide

(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的觸屏和鍵盤上「大步流星」,看到隨隨便便一個分享都是英文文檔,都以爲本身還要很長的一段路要走,菜鳥也要努力飛翔啊!

相關文章
相關標籤/搜索