Android MVP设计模式的理解
2016-05-19 18:06
609 查看
做Android开发久了会有一种感觉,那就是业务逻辑总是伴随大量UI更新操作,最后我们的代码中UI更新伴随业务逻辑,业务逻辑发生伴随UI更新。如此纠缠,当一个类的代码越来越多的时候,过些日子再回头看,很乱很乱。作为一个长期运营的项目,这种做法是不可取的,当项目交到下一个人的手里,我只想说God will be with you. 所以从今以后,我们必须采取新的开发模式,尽管看起来繁琐一些,但是理解了思想就会发现你可以从业务逻辑和UI的纠缠中解放出来。
先谈谈我个人对MVP模式的理解:服务端一般是MVC,其实两者名字不同,但相差并不大,核心的思想都是将业务逻辑同展现分离。隔离最好的方式就是使用接口,使得不同的组件依赖于抽象的接口,不依赖具体的实现,当修改代码的时候,由于接口不变,而我们的业务逻辑依赖于接口,因此得到了解放。
活用MVP:并不是工程里一定要有M,但是V和P是一定要有的,P负责了业务逻辑的处理,并调用相应的更新UI的接口V,这里再次强调一下,业务逻辑是依赖于更新UI的抽象接口的。说的这么抽象,看个简单的例子。
这个例子模拟程序的启动页,当程序启动的时候去获取网络状态,显示进度条模拟更新数据,获取成功就跳到下一个activity并关闭进度条,获取失败就提示用户失败
新建一个Android工程,新建包com.model com.model.impl com.view com.presenter
在com.model下建立一个接口INetConnect:
在com.model.impl下建立一个INetConnect具体实现类INetConnectImpl:
接着在com.view下定义一组更新UI的接口ISplashView:
再编写我们的业务逻辑实现类SplashPresenter:
最后看一下我们的Activity:
好了,MVP的思想就是定义一组和UI更新相关的接口,并用presenter做业务逻辑处理,业务逻辑处理的只依赖于我们定义的接口,并不依赖具体UI如何更新。
先谈谈我个人对MVP模式的理解:服务端一般是MVC,其实两者名字不同,但相差并不大,核心的思想都是将业务逻辑同展现分离。隔离最好的方式就是使用接口,使得不同的组件依赖于抽象的接口,不依赖具体的实现,当修改代码的时候,由于接口不变,而我们的业务逻辑依赖于接口,因此得到了解放。
活用MVP:并不是工程里一定要有M,但是V和P是一定要有的,P负责了业务逻辑的处理,并调用相应的更新UI的接口V,这里再次强调一下,业务逻辑是依赖于更新UI的抽象接口的。说的这么抽象,看个简单的例子。
这个例子模拟程序的启动页,当程序启动的时候去获取网络状态,显示进度条模拟更新数据,获取成功就跳到下一个activity并关闭进度条,获取失败就提示用户失败
新建一个Android工程,新建包com.model com.model.impl com.view com.presenter
在com.model下建立一个接口INetConnect:
package com.model; import android.content.Context; /** * 负责获取网络状态的接口 * */ public interface INetConnect { boolean isNetConnect( Context context); }
在com.model.impl下建立一个INetConnect具体实现类INetConnectImpl:
package com.model.impl; import com.model.INetConnect; import android.content.Context; import android.net.ConnectivityManager; import android.net.NetworkInfo; /** * 获取网络状态的一种实现方式 * */ public class INetConnectImpl implements INetConnect { @Override public boolean isNetConnect(Context context) { if (context != null) { ConnectivityManager mConnectivityManager = (ConnectivityManager) context .getSystemService(Context. CONNECTIVITY_SERVICE); NetworkInfo mNetworkInfo = mConnectivityManager .getActiveNetworkInfo(); if(mNetworkInfo != null) { return mNetworkInfo.isAvailable(); } } return false; } }
接着在com.view下定义一组更新UI的接口ISplashView:
package com.view; /** * 更新UI视图的接口,每个Activity一个这样的接口 * */ public interface ISplashView { void showProcessBar(); void hideProcessBar(); void showNetError(); void startNextActivity(); }
再编写我们的业务逻辑实现类SplashPresenter:
package com.presenter; import com.model.INetConnect; import com.model.impl.INetConnectImpl; import com.view.ISplashView; import android.content.Context; /** * 我们的业务逻辑实现,这个过程调用的都是接口完成的,不依赖具体实现。 * 每个Activity一个这样的Presenter * */ public class SplashPresenter { private INetConnect iCconnect; private ISplashView iView; public SplashPresenter(ISplashView iView){ this.iView = iView; iCconnect = new INetConnectImpl(); } public void didFinishLoading(Context context){ iView.showProcessBar(); if(iCconnect.isNetConnect(context)){ iView.startNextActivity(); } else{ iView.showNetError(); } iView.hideProcessBar(); } }
最后看一下我们的Activity:
package com.example.mvp; import android.app.Activity; import android.app.ProgressDialog; import android.os.Bundle; import android.widget.Toast; import com.presenter.SplashPresenter; import com.view.ISplashView; /** * MVP设计模式,最适合Android开发,再也不用担心业务逻辑和UI纠缠的太深了。 * 我们的每个业务流程都可以用这个模型来表达,代码清晰可扩展。接口化为我们提供了约束,把UI操作和非UI操作隔离 * @author zhangshiming * */ public class MainActivity extends Activity implements ISplashView{ /**负责根据Model接口获取数据,处理业务逻辑,并通过View来呈现。 我们的业务逻辑都写在这里**/ private SplashPresenter mPresenter; private ProgressDialog mProgressBar; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout. activity_main); /**为ISplashView(更新UI)初始化具体实现类**/ mPresenter = new SplashPresenter(this); } @Override protected void onResume() { super.onResume(); /**执行我们的业务逻辑**/ mPresenter.didFinishLoading(this); } /** * 以下4个方法为ISplashView具体实现 */ @Override public void showProcessBar() { if (mProgressBar == null) { mProgressBar = new ProgressDialog( this); mProgressBar.setCancelable( true); mProgressBar.setCanceledOnTouchOutside( true); mProgressBar.setMessage( "更新数据中,请稍后" ); } mProgressBar.show(); } @Override public void hideProcessBar() { mProgressBar.hide(); } @Override public void showNetError() { Toast.makeText(this, "暂无网络", Toast.LENGTH_SHORT).show(); } @Override public void startNextActivity() { Toast.makeText(this, "跳到下个activity", Toast.LENGTH_SHORT).show(); } }
好了,MVP的思想就是定义一组和UI更新相关的接口,并用presenter做业务逻辑处理,业务逻辑处理的只依赖于我们定义的接口,并不依赖具体UI如何更新。
相关文章推荐
- Androidstudio安装GsonFormat快速生成实体类插件
- 关于Jenkins使用Gradle对android项目打包遇到的问题总结
- 在studio中遇见 解决Gradle DSL method not found: ‘android()’
- Android Context原理与使用的总结
- (OK) ns3—genymotion—android
- android 任务Task及回收栈back stack介绍
- android 任务Task及回收栈back stack介绍
- 浅谈MVP in Android
- Android获取手机中外置内存卡、内置内存卡、手机内存路径
- Android代码混淆配置(Proguard文件解析)
- Android开发常识
- 【42】android Context深度剖析
- 【42】android Context深度剖析
- 【42】android Context深度剖析
- Android: activity跳转时,每次都自动调用onfinish()
- Android自定义控件之开关按钮学习笔记分享
- 修改setting的文本框高亮颜色和android系统全局高亮颜色
- Android开发之Intent.Action
- Android studio如何将项目生成doc文档
- Android反调试之 AntiEmulator 检测安卓模拟器