android ble mvp,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,也不要为了解耦而解耦,一定要根据自己项目的实际情况和发展,来决定自己的项目该怎么做,希望能够和大家一起成长

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值