美团实习| 周记(一)

来实习公司有一周多了,从熟悉工做环境到业务到参与项目这段时间,真的受益不浅,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的触屏和键盘上“大步流星”,看到随随便便一个分享都是英文文档,都以为本身还要很长的一段路要走,菜鸟也要努力飞翔啊!

相关文章
相关标签/搜索