如何由网页生成网站,网站做专题,业务外包是什么意思,深圳企业建站平台mvvm可以理解成使用databing的mvp模式#xff0c;modleview 通过接口让view和Presenter层解耦
从图中就可以看出#xff0c;最明显的差别就是view层和model层不再相互可知#xff0c;完全的解耦#xff0c;取而代之的presenter层充当了桥梁的作用#xff0c;用于操作view…mvvm可以理解成使用databing的mvp模式modleview 通过接口让view和Presenter层解耦
从图中就可以看出最明显的差别就是view层和model层不再相互可知完全的解耦取而代之的presenter层充当了桥梁的作用用于操作view层发出的事件传递到presenter层中presenter层去操作model层并且将数据返回给view层整个过程中view层和model层完全没有联系。看到这里大家可能会问虽然view层和model层解耦了但是view层和presenter层不是耦合在一起了吗其实不是的对于view层和presenter层的通信我们是可以通过接口实现的具体的意思就是说我们的activityfragment可以去实现实现定义好的接口而在对应的presenter中通过接口调用方法。不仅如此我们还可以编写测试用的View模拟用户的各种操作从而实现对Presenter的测试。这就解决了MVC模式中测试维护难的问题。 ----------------------------------- android开发mvp案例 安卓开发mvp https://blog.51cto.com/u_14844/7436944
例子
布局文件我就不介绍了大家都能猜到了 首先先看一下MainConstract MainConstract 里面包含了View、Model、Presenter三层的接口用于给对应的三层实现。把它写在一个类里是为了减少class文件的创建。
public class MainConstract { public interface IMainView { //刷新列表数据 void refreshData(ListString data); //刷新数据失败提示 void showRefreshError(); } public interface IMainModel { //访问网络获取数据模型 void getListData(OnHttpCallBackListString onHttpCallBack); } public interface IMainPresenter { //获得Model层返回的列表数据 void getListData(); }
} 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 大家可能注意到上面的OnHttpCallBack它是为了给请求数据成功和失败进行回调的接口
public interface OnHttpCallBackT { void onSuccess(T data); void onFail(String error); } 1. 2. 3. 4. 5. Model层的代码
public class MainModel implements MainConstract.IMainModel { Override public void getListData(final OnHttpCallBackListString onHttpCallBack) { new AsyncTaskVoid,Void,ListString(){ Override protected ListString doInBackground(Void... voids) { //模拟请求网络获得数据 try { Thread.sleep(2000); } catch (InterruptedException e) { e.printStackTrace(); } ListString datanew ArrayList(); for (int i 0; i 10; i) { data.add(条目:i); } return data; } Override protected void onPostExecute(ListString data) { super.onPostExecute(data); //成功获取数据回调 onHttpCallBack.onSuccess(data); } Override protected void onCancelled(ListString data) { super.onCancelled(data); //获取数据失败回调 onHttpCallBack.onFail(获取数据超时....); } }.execute(); } } 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 可以看到model层只负责数据的获取和解析成对应的数model这个和MVC的Model层一致成为一个独立的单元其他层不需要关心它是如何实现达到解耦的目的。
View层代码
public class MainActivity extends AppCompatActivity implements MainConstract.IMainView { ListView listView; SwipeRefreshLayout swipeRefreshLayout; private ListString mDatanew ArrayList(); private MainPresenter mainPresenter; private ListAdapter listAdapter; Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); listView (ListView) findViewById(R.id.listview); //初始化Presenter层 mainPresenter new MainPresenter(this); listAdapter new ListAdapter(this,mData); listView.setAdapter(listAdapter); //初始化填充数据 mainPresenter.getListData(); } Override public void refreshData(ListString data) { listAdapter.updateData(data); } Override public void showRefreshError() { Toast.makeText(this,数据获取失败,Toast.LENGTH_LONG).show(); } } 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 可以看到Activity彻底的成为View层只负责UI的显示、隐藏、数据的填充实际上到底在什么时候显示隐藏填充数据View层完全不需要考虑只需要提供接口给Presenter层调用把所有的业务逻辑交给Presenter层处理。
Presenter层代码
public class MainPresenter implements MainConstract.IMainPresenter { private MainModel mainModel; private MainConstract.IMainView mainView; public MainPresenter(MainConstract.IMainView mainView){ this.mainViewmainView; mainModel new MainModel(); } Override public void getListData() { mainModel.getListData(new OnHttpCallBackListString() { Override public void onSuccess(ListString data) { //数据获取成功后刷新adapter mainView.refreshData(data); } Override public void onFail(String error) { //数据获取失败提示语 mainView.showRefreshError(); } }); } } ----------------------------------- android开发mvp案例 安卓开发mvp https://blog.51cto.com/u_14844/7436944