管理【译】Android技术栈,1#架构

尾随刘润先生的管理学学习,整理了一层层笔记,和各位童鞋共享之。

正文是何等开发一款有着扩充性,维护性和测试性的Android应用专题的率先篇。本专题将会提到到一些设计格局和类库的选取方法,收缩Android
Developer
常见费用的沉闷。

治本是不错也是艺术

简介:##

作为例子,我将动用以下这几个类型,事实上就是一个简短的电影概念目录,可以称呼视图或者别的。

至于影片的音信能够从一个叫做Themoviedb的精晓API中收获,在这些版块中Apiary可以找到正确的文档表达。

种类基于Model View
Presenter

设计形式,也参照了一些Material
Design

设计规范,比如转场,(界面)结构,动画,配色等等。

所有代码都可以从Github中赢得,所以请随意看,那里同样有一个视频用来呈现App。

Paste_Image.png

1.法学的真相是鼓舞人的善心

架构:##

架构的规划基于Model View
Presenter

,它是管理,Model View
Controller

设计情势的一个变种。

那种设计试图抽象Presentation层的作业逻辑,在Android中这是很重点的,因为自己Framework
提倡那两部分与数量层解耦合,一个驾驭的事例就是AdaptersCursorLoaders

那种架构促使业务逻辑层和数据层不再随着视图层的转换而变更,那样无论Domain层的代码复用仍然例如Database或者REST
API
等数据源的改观,都变得简单起来。

激起职工的好意,让职工百尺竿头更进一步,自驱动工作。能完毕此的不五只是有。比如谷歌(谷歌)、海底捞、罗辑思维。谷歌(谷歌)提供了随机、激发创意的环境和红火的员工福利,海底捞给予员工信任,像关怀家人一样关心员工,罗辑思维一样予以每个职工最大的轻易发挥权。

概述##

这种布局可以被分割为多个重大层次:

  • presentation
  • model
  • domain

Presentation
Presentation层负责提供数据并出示图形化界面。

Model
Model层将担当提供音信,这一层并不知道Presentation层和Domain,它亦可与数据库,REST
API或者其他可持久化数据等落实一而再。

在这一层,也落到实处部分应用程序的实体类,用来表示,电影,系列等等。

Domain
Domain层完全独立于Presentation层之外,这一层专门处总管务逻辑。

那如何激发人的美意呢?从马斯洛需要理论切入,分化员工必要分歧,激发善意手段自然差距。基层员工首先要保险生理要求,金钱就是最好的刺激手段。第二层需求是安全要求,让员工有安全感,多发员工福利能让职工觉得公司稳定,前景好。第三层须求是交际须要,满足职工社交需要,就要多进行员工活动,多开聚会和晚会。第四层需求是讲究要求,那时候激励手段就是让员工感到受尊重,在义务范围内予以对应的授权,记住员工名字,多和职工交换沟通,尊重她的观点。最终一层必要是自我达成,经典的案例就是史蒂夫聘请Sprite总监斯波兹南时,对斯埃里温说的那句,你是想继续卖糖水呢如故想跟自己联合改变世界?

实现##

Domain层和Model层被放到四个java module中,app
module也就是Android应用代表Presentation层,那里还有其余一个common
module,用来存放在一些公共类库和工具类们。

Domain module

Domain
module存放着有些usecase和它们的兑现类,它们是应用程序的事体逻辑。

本条module完全独立于Android framework

凭借它的模块有model module和common module。

一个usecase可以用来博取分裂品种电影的总评分,看一看哪个项目标影视最受欢迎,usecase亟需获取音信然后做出统计,所有那几个新闻都由Model层提供。

dependencies {
    compile project (':common')
    compile project (':model')
}

职工处于分化阶段,激发善意手段要不等,不要在职工还在设想生理要求时就跟他谈好好,也决不在职工想要自我完结阶段只提供面包。

Model module##

model
module负责处理音讯,查询,保存,删除等等,我只处理了从API获取电影详情的操作。

也促成了部分实体类,比如TvMovie,用来显现一部电影。

它方今只依赖common
module,通过那个类库处理API请求,在那些例子中本身利用Square出品的Retrofit,我将在接下去的博客中介绍Retrofit。

dependencies {
    compile project(':common')
    compile 'com.squareup.retrofit:retrofit:1.9.0'
}

【蔷薇思】激发职工爱心能让员工自驱动工作,激发外人的善意能让外人主动协助你。我们不可以给人家发工钱,但要么得以发现外人其他马斯洛须求:帮朋友推荐工作,分享好音讯,整合营源帮朋友间牵线搭桥。做一个诚心、乐于助人的人,也许某一天朋友就会济困扶危。

Presentation module##

就算Android应用自身,包括resources, assets, 逻辑等等。

它与实施usecaseDomain拓展相互,比如可以用来获取某一时分的影片列表,或者从某个电影中收获特殊的多寡。

这一个模块只含有PresenterView

每一个ActivityFragmentDialog都实现MVPView接口,它指定了部分在View上开展显示,隐藏,突显新闻等操作。

比如,PopularMoviesView由此点名一些操作浮现当前电影列表,然后MoviesActivity实现它。

public interface PopularMoviesView extends MVPView {

    void showMovies (List<TvMovie> movieList);

    void showLoading ();

    void hideLoading ();

    void showError (String error);

    void hideError ();
}

MVP设计情势就是让View变得硬着头皮的简练,由Presenter决定它们的行为。(译者注:View层应反映KISS原则,感兴趣的校友可以精晓一下Keep
it simple stupid

public class MoviesActivity extends ActionBarActivity implements
    PopularMoviesView, ... {

    ...
    private PopularShowsPresenter popularShowsPresenter;
    private RecyclerView popularMoviesRecycler;
    private ProgressBar loadingProgressBar;
    private MoviesAdapter moviesAdapter;
    private TextView errorTextView;

    @Override
    protected void onCreate(Bundle savedInstanceState) {

        ...
        popularShowsPresenter = new PopularShowsPresenterImpl(this);
        popularShowsPresenter.onCreate();
    }

    @Override
    protected void onStop() {

        super.onStop();
        popularShowsPresenter.onStop();
    }

    @Override
    public Context getContext() {

        return this;
    }

    @Override
    public void showMovies(List<TvMovie> movieList) {

        moviesAdapter = new MoviesAdapter(movieList);
        popularMoviesRecycler.setAdapter(moviesAdapter);
    }

    @Override
    public void showLoading() {

        loadingProgressBar.setVisibility(View.VISIBLE);
    }

    @Override
    public void hideLoading() {

        loadingProgressBar.setVisibility(View.GONE);
    }

    @Override
    public void showError(String error) {

        errorTextView.setVisibility(View.VISIBLE);
        errorTextView.setText(error);
    }

    @Override
    public void hideError() {

        errorTextView.setVisibility(View.GONE);
    }

    ...
}

这个usecase通过Presenter调用,并且Presenter接过相应结果,然后处理View上的展现。

2.刺激要当先员工想象

通信##

对此那些项目,我接纳了Message
Bus
(译者注:新闻总线)系统,这一个连串对于播放事件,或者在七个零部件之间确立通信是可怜管用的,更加越发适用于后人。

基本上,通过Bus出殡事件,对事件感兴趣的类,需求订阅Bus,才能消费非凡事件。

适用这几个连串可以下跌模块间的耦合度。

为了完毕那个系统总线,我利用Square出品的Otto类库。

自身定义了三个Bus,一个用来使usecase和REST
API进行通信,另一个用来发送事件至Presentation
层。

REST_BUS动用任意线程处总管件,UI_BUS拔取默许线程发送事件,这一个线程就是主线程。

public class BusProvider {

    private static final Bus REST_BUS = new Bus(ThreadEnforcer.ANY);
    private static final Bus UI_BUS = new Bus();

    private BusProvider() {};

    public static Bus getRestBusInstance() {

        return REST_BUS;
    }

    public static Bus getUIBusInstance () {

        return UI_BUS;
    }
}

以此类经过common
module管理。因为兼具的模块都亟待拜访它,从而与Bus进行交互。

dependencies {
    compile 'com.squareup:otto:1.3.5'
}

最后,想象一下这些场所,当用户打开应用,突显最受欢迎的影片。

View调用onCreate()方法时,Presenter订阅UI_BUS收纳事件。当onStop()措施被调用的时候Presenter撤回订阅。Presenter运行GetMoviesUseCase这个usecase

@Override
    public void onCreate() {

        BusProvider.getUIBusInstance().register(this);

        Usecase getPopularShows = new GetMoviesUsecaseController(GetMoviesUsecase.TV_MOVIES);
        getPopularShows.execute();
    }

    ...

    @Override
    public void onStop() {

        BusProvider.getUIBusInstance().unregister(this);
    }
}

为了接收事件,Presenter急需已毕一个主意,那几个办法所接受参数的数据类型必须与Bus发送的轩然大波的数据类型一致,兵器必须利用注脚:@Subscribe

@Subscribe
    @Override
    public void onPopularMoviesReceived(PopularMoviesApiResponse popularMovies) {

        popularMoviesView.hideLoading();
        popularMoviesView.showMovies(popularMovies.getResults());
    }

对员工的刺激有三种,一种是职工觉得“应得的”,一种员工觉得“太好了”,让员工觉得太好了激励才起成效。办公室饮水,薪俸,中秋礼品都是应得的造福,员工不会为此感恩涕零;绩效、升职加薪、在工作中得到自我完成、小节日的肆意眷注、集团提供健身福利,才会让职工觉得太好了;提供超越员工想象的激发,激励才有效应。

资源:##

【蔷薇思】在成品打磨时,有一条是要让用户有“aha
moment”感觉。如此用户才会留下来。三星手机、索尼(Sony)耳机就让用户有惊艳的感觉到。我想起的首个例证是,为啥会有那么多大龄未婚女青年,因为他俩追求的是“太好了”的目的。

3.制订目的,要“刚刚好”

就算激励奖金诱人,但只要目标如月亮一样不可摘,同样达不到激励效益。制度制定要让职工有能力和希望完结,目标如若跳一跳可以获取,员工有能力达到。激励奖金要丰富大,让员工有意愿完结。

【蔷薇思】公司制定目的要刚刚好,个人年度目的一致要刚刚好,据计算,能一气浑成新年希望的食指不到10%,目的无法形成的一个生死攸关原由就是目的太大。新年早先,壮志酬筹,想要一展宏图,于是大发心愿,二〇一九年要读100本书,成为工作上的大家,一年下来只读了一本书,成为了劳作上的“砖家”,就是因为没有考虑对象完毕的可能性。可以预估一件事的大体周期,是可信的一个重大显示。化为一个领域专家,须要10000小时刻意操练,每一天2钟头,需求将近14年才能成就。

第二点,激励对个体同样有效。“先定一个能达标的小目的”,用自己渴望已久的宝物激励自己,效果甚佳。

#蔷薇记#: 记录生活之美和智慧之妙。

那是蔷薇石原创的第64篇文章。

Post Author: admin

发表评论

电子邮件地址不会被公开。 必填项已用*标注