Android Lifecycle 对MVP模式进一步”解耦“

传统的MVP模式中,不可避免要在V中的生命周期中要做很多业务操作,导致actitvity等还是臃肿不堪。因此,谷歌在2017年的IO大会上推出了Lifecycle框架,希望借Lifecycle将activity的生命周期事件传递给Presenter,让Presenter承担部分业务,从而降低了Activity的复杂度。lifecycle本身就是一个依赖注入的框架,具体的原理和源码也比较简单,这里就不做源码分析了,废话不多说,直接上代码

传统的MVP模式中,我们依然要在Activity的各个生命周期内,完成相关的操作,如广播注册注销,AIDL连接释放,地图的SDK相关调用,相关资源的释放等
举个例子,请看下面写的传统的Activity代码

package com.example.helang.lifecycledemo;

import android.content.Intent;
import android.os.Bundle;
import android.support.annotation.Nullable;
import android.support.v7.app.AppCompatActivity;

public class OldPresenterMainActivity extends AppCompatActivity {

    private Presenter presenter;
    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_scrolling);

        presenter = new Presenter(this);
        presenter.doWork();
    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
        unregisters();
    }

    /**
     * 注册广播
     * (忽略具体的实现)
     */
    private void registers(){
//        Intent intent = new Intent();
//        registerReceiver("xxx","xxx");
    }

    /**
     * 注销广播
     */
    private void unregisters(){
//        unregisterReceiver(xxx);
    }
}

如果是要做地图相关的开发,那么Activity中的各个生命周期的内的代码将会很多,会让Activity承担各种非UI操作的代码

但是,利用LifecycleObserver,封装一个IPresenter的接口,方便Presenter来实现

package com.example.helang.lifecycledemo;

import android.arch.lifecycle.Lifecycle;
import android.arch.lifecycle.LifecycleObserver;
import android.arch.lifecycle.LifecycleOwner;
import android.arch.lifecycle.OnLifecycleEvent;
import android.support.annotation.NonNull;

/**
 *
 * lifecycle observer
 * Created by helang on 2018/6/19.
 */

public interface IPresenter extends LifecycleObserver {

    @OnLifecycleEvent(Lifecycle.Event.ON_CREATE)
    void onCreate(@NonNull LifecycleOwner owner);

    @OnLifecycleEvent(Lifecycle.Event.ON_RESUME)
    void onResume(@NonNull LifecycleOwner owner);

    @OnLifecycleEvent(Lifecycle.Event.ON_PAUSE)
    void onPause(@NonNull LifecycleOwner owner);

    @OnLifecycleEvent(Lifecycle.Event.ON_STOP)
    void onStop(@NonNull LifecycleOwner owner);

    @OnLifecycleEvent(Lifecycle.Event.ON_DESTROY)
    void onDestroy(@NonNull LifecycleOwner owner);
}

下面就是处理后的Presenter

package com.example.helang.lifecycledemo;

import android.arch.lifecycle.LifecycleOwner;
import android.content.Context;
import android.support.annotation.NonNull;
import android.util.Log;

/**
 * 其实也要基于MVP来做的,这样解耦才能更加好,同时也可以更好地处理MVP中的生命周期的问题
 * Presenter承担更多业务上的操作,但是,也不易把过多的业务转到Presenter中,不然会造成Presenter变成第二个"Activity"
 * Created by helang on 2018/6/19.
 */

public class Presenter implements IPresenter {

    private static final String TAG = "Presenter";

    private Model model = new Model();
    private Context context;

    public Presenter(Context context) {
        this.context = context;
    }

    public void doWork(){
        model.startWork();
    }


    /**
     * 绑定远程服务
     */
    private void bindService(){
        //连接Aidl服务,代码我就不写了
        Log.d(TAG,"bindService");
    }

    /**
     * 解绑远程服务
     */
    private void unbindService(){
        //断开Aidl服务
        Log.d(TAG,"unbindService");
    }


    /**
     * 比如注册动态广播等操作可以转移到Presenter中,进一步降低Activity的复杂性
     */
    private void register(){
//        context.registerReceiver(null,null);
    }

    private void unregister(){
//        context.unregisterReceiver(null);
    }



    /**
     * 创建资源等
     * @param owner
     */
    @Override
    public void onCreate(@NonNull LifecycleOwner owner) {
        Log.e(TAG,"onCreate");
        register();
        bindService();
    }

    @Override
    public void onResume(@NonNull LifecycleOwner owner) {

    }

    @Override
    public void onPause(@NonNull LifecycleOwner owner) {

    }

    @Override
    public void onStop(@NonNull LifecycleOwner owner) {

    }

    /**
     * 释放资源等
     * @param owner
     */
    @Override
    public void onDestroy(@NonNull LifecycleOwner owner) {
        Log.e(TAG,"onDestroy");
        model.endWork();
        unregister();
        unbindService();

    }
}

最终的Activity

package com.example.helang.lifecycledemo;

import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;

/**
 * 利用MVP加lifeCycle就可以解耦更加彻底,减少了Activity中的代码量和各种重复的代码
 * 同时也可以更好地处理MVP中的生命周期的问题,防止发生内存泄漏
 */
public class MainActivity extends AppCompatActivity {

    private Presenter presenter;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_scrolling);

        presenter = new Presenter(this);
        getLifecycle().addObserver(presenter);//为Lifecycle注册生命周期监听器
        presenter.doWork();

    }

}

最终的Activity的确少了很多代码,它也只需要关注和页面的显示,操作;其他的生命周期之内的事情交给Presenter来处理即可

总结:Android的Lifecycle代码很简单,更多的像是一个语法糖,但是,也不要把所有业务处理都丢给Presenter,也不要为了解耦而解耦,一定要根据自己项目的实际情况和发展,来决定自己的项目该怎么做,希望能够和大家一起成长

代码地址:https://github.com/helang1991/LifeCycleDemo

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 156,069评论 4 358
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 66,212评论 1 287
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 105,912评论 0 237
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 43,424评论 0 202
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 51,741评论 3 285
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,194评论 1 206
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,553评论 2 307
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,289评论 0 194
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 33,923评论 1 237
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,251评论 2 240
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 31,775评论 1 255
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,144评论 2 249
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 32,698评论 3 228
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 25,936评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,658评论 0 192
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,214评论 2 267
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,159评论 2 258

推荐阅读更多精彩内容