mvvm可以理解成使用databing的mvp模式,modleview

通过接口让view和Presenter层解耦
从图中就可以看出,最明显的差别就是view层和model层不再相互可知,完全的解耦,取而代之的presenter层充当了桥梁的作用,用于操作view层发出的事件传递到presenter层中,presenter层去操作model层,并且将数据返回给view层,整个过程中view层和model层完全没有联系。看到这里大家可能会问,虽然view层和model层解耦了,但是view层和presenter层不是耦合在一起了吗?其实不是的,对于view层和presenter层的通信,我们是可以通过接口实现的,具体的意思就是说我们的activity,fragment可以去实现实现定义好的接口,而在对应的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(List<String> data);
         //刷新数据失败提示
         void showRefreshError();
    }
     public interface IMainModel {
         //访问网络获取数据模型
         void getListData(OnHttpCallBack<List<String>> 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 OnHttpCallBack<T> {
    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 OnHttpCallBack<List<String>> onHttpCallBack) {
        new AsyncTask<Void,Void,List<String>>(){
            @Override
            protected List<String> doInBackground(Void... voids) {
                //模拟请求网络获得数据
                try {
                    Thread.sleep(2000);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                List<String> data=new ArrayList<>();
                for (int i = 0; i < 10; i++) {
                    data.add("条目:"+i);
                }
                return data;
            }
            @Override
            protected void onPostExecute(List<String> data) {
                super.onPostExecute(data);
                //成功获取数据回调
                onHttpCallBack.onSuccess(data);
            }
            @Override
            protected void onCancelled(List<String> 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 List<String> mData=new 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(List<String> 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.mainView=mainView;
         mainModel = new MainModel();
     }
     @Override
     public void getListData() {
         mainModel.getListData(new OnHttpCallBack<List<String>>() {
             @Override
             public void onSuccess(List<String> data) {
                 //数据获取成功后刷新adapter
                 mainView.refreshData(data);
             }
             @Override
             public void onFail(String error) {
                 //数据获取失败,提示语
                 mainView.showRefreshError();
             }
         });
     }
 }
 -----------------------------------
 android开发mvp案例 安卓开发mvp
 https://blog.51cto.com/u_14844/7436944



















