美团实习| 周记(一)

来实习公司有一周多了,从熟悉工作环境到业务到参与项目这段时间,真的受益匪浅,get到很多新知识,也发现自己知识储备上的不足,特此开一个专题“实习随笔”来回顾每周的知识点和一些感悟,篇幅受限,只能简单记录,主要还是通过链接形式拓展和补充。本周知识清单:

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

1.Git、GitHub、Stash

以前做项目托管代码时,选择的是GitHub开源平台,因为在AndroidStudio中有很好的集成了这一功能,只需要通过点击VCS选项卡下Git的几个命令即可,具体操作详见AS中Git与GitHub的使用入门如何用AndroidStudio导入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的触屏和键盘上“健步如飞”,看到随随便便一个分享都是英文文档,都觉得自己还要很长的一段路要走,菜鸟也要努力飞翔啊!

公司的福利月饼

推荐阅读更多精彩内容