关于MVP模式的介绍我也就不再多说了,网上一大推,简要的说下MVP模式下的4个要素,然后直接上代码。
在MVP模式里通常包含4个要素:
(1)View:负责绘制UI元素、与用户进行交互(在Android中体现为Activity);
(2)View interface:需要View实现的接口,View通过View interface与Presenter进行交互,降低耦合,方便进行单元测试;
(3)Model:负责存储、检索、操纵数据(有时也实现一个Model interface用来降低耦合);
(4)Presenter:作为View与Model交互的中间纽带,处理与用户交互的负责逻辑
modle包下请求数据,presenter包下进行modle和View的联调,ui包下为View,entity包下为Bean。
开始上代码:
(1):
public interface PresenterCallback { void load(String url); void getData(BeanEntity beanEntity); }博主英文一般般,起码方法名还是见名知意。
(2):
public interface DownLoadCallBack { void load(String url, PresenterCallback presenterCallback); }此处方法的第二参数为什么是(1)中的接口对象?接着往下看就很快明白了
(3):
public interface UICallBack { void getData(BeanEntity beanEntity); }这个接口的目的,是为了在View中回调接口,获取数据。
(4):
public class DownLoad implements DownLoadCallBack { private Handler handler = new Handler(); @Override public void load(final String url, final PresenterCallback presenterCallback) { //此处起线程网络请求数据 new Thread(new Runnable() { @Override public void run() { try { Thread.sleep(3000);
//真实网络请求数据,得到数据后在此处进行解析。 handler.post(new Runnable() { @Override public void run() { presenterCallback.getData(new BeanEntity("下载完成" + url)); } }); } catch (InterruptedException e) { e.printStackTrace(); } } }).start(); } }此处解释了刚才DownLoadCallBack接口中的load()的第二个参数为什么是PresenterCallBack了,就是为了回调得到数据。
(5):
public class Presenter implements PresenterCallback { private UICallBack uiCallBack; private DownLoadCallBack downLoadCallBack; public Presenter(UICallBack uiCallBack) { this.uiCallBack = uiCallBack; downLoadCallBack=new DownLoad(); } @Override public void load(String url) { downLoadCallBack.load(url,this); } @Override public void getData(BeanEntity beanEntity) { uiCallBack.getData(beanEntity); } }
此处downloadCallBack=new DownLoad();运用了java中的多态,父类引用指向子类对象,调用子类重写的方法。
代码写到这里MVP已经完成差不多了,就差最后一步了。
(6):
public class MainActivity extends AppCompatActivity implements UICallBack { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); new Presenter(this).load("api接口"); } @Override public void getData(BeanEntity beanEntity) { String data = beanEntity.getData(); Log.i("-----",data); } }走到这之后,MVP模式代码其实已经写完了,我们一起来看看log日志。
显然结果正是我们想要的,我们再来一起看看MainActivity中的代码,是不是只是对UI进行处理和一些逻辑的判断,MVP模式就是一种设计思想,有的人喜欢再把解析分离出来,虽然说分包能多一点,但是代码看起来结构更明显,可读性也大大增强。希望此篇博文对你有帮助。