王学岗app架构设计-MVP

来源:互联网 发布:数控车床手工编程入门 编辑:程序博客网 时间:2024/06/12 18:03

因为MVC设计架构的缺点,所以我们引入了MVP设计架构
V:视图层:
Activity作为我们的视图层,负责绘制、显示UI;用户交互但不处理,处理在presenter
P: 逻辑层:Presenter/prɪˈzentər/主持
作为View与Model的交互的中间纽带,处理与用户交互的逻辑
M:模型层:
针对业务模型,建立数据结构和相关类,model层与View层无关,与业务相关的数据的操作,针对网络的操作都应该放到model层
我们看下包与类的结构
这里写图片描述
大家注意model层的代码没有任何变化,
下面我只把view层和presenter层按照从上到下的顺序贴出来

package com.model.gang.impl;import com.model.gang.IGetUser;import com.model.gang.OnUserInfoListenner;import com.model.gang.User;//获取数据,获取数据是在model层// 可以在网络,数据库,服务器,文件等获取数据public class GetUserInfoImp implements IGetUser {    @Override    public void getUserInfo(final int id, final OnUserInfoListenner listenner) {        // 模拟子线程耗时操作        new Thread() {            public void run() {                try {                    Thread.sleep(2000);                } catch (InterruptedException e) {                    // TODO Auto-generated catch block                    e.printStackTrace();                }                if (id == 1) {                    User user = new User();                    user.setName("葛柳君");                    user.setAge(18);                    user.setSex("动物");                    // 谁实现了该监听谁就得到了这个数据                    listenner.getUusrInfoSuccess(user);                } else {                    listenner.getUusrInfoFail();                }            }        }.start();    }}
package com.presenter.gang;import android.os.Handler;import com.model.gang.IGetUser;import com.model.gang.OnUserInfoListenner;import com.model.gang.User;import com.model.gang.impl.GetUserInfoImp;import com.view.gang.IsShowUserView;//作为view和model的交互的中间纽带,处理与用户交互的逻辑//View层 与 presenter层同时开发,即便是不知道View层(布局)也不妨碍presenter的设置//所有的Activity,不管你是什么页面布局,你都遵循presenter层的逻辑,即:先显示进度条,然后获取数据,然后判断数据是否获取成功public class UserInfoPresenter {    // 从这里拿到数据    private IGetUser mIGetUser;    // 从这里拿到视图/控件    private IsShowUserView mIsShowUserView;    private Handler myHandler = new Handler();    public UserInfoPresenter(IsShowUserView mIsShowUserView) {        super();        // 数据        this.mIGetUser = new GetUserInfoImp();        // view        this.mIsShowUserView = mIsShowUserView;    }    public void dataBindView(int id) {        // 首先显示进度条        mIsShowUserView.showLoading();        // 获取数据        mIGetUser.getUserInfo(id, new OnUserInfoListenner() {            @Override            public void getUusrInfoSuccess(final User user) {                myHandler.post(new Runnable() {                    @Override                    public void run() {                        // 获取数据成功就隐藏进度条                        mIsShowUserView.hideLoading();                        // 显示数据                        mIsShowUserView.toMainActivity(user);                    }                });            }            @Override            public void getUusrInfoFail() {                myHandler.post(new Runnable() {                    @Override                    public void run() {                        mIsShowUserView.hideLoading();                        mIsShowUserView.showFailedError();                    }                });            }        });    }}
package com.view.gang;import com.model.gang.User;//抽象出一个接口,约束他的功能public interface IsShowUserView {    void showLoading();    void hideLoading();    // 把用户显示到Activity中    void toMainActivity(User user);    void showFailedError();}
package com.view.gang;import android.app.Activity;import android.app.ProgressDialog;import android.os.Bundle;import android.os.Handler;import android.view.Menu;import android.view.View;import android.view.View.OnClickListener;import android.widget.Button;import android.widget.TextView;import android.widget.Toast;import com.example.jiagou.R;import com.model.gang.IGetUser;import com.model.gang.OnUserInfoListenner;import com.model.gang.User;import com.model.gang.impl.GetUserInfoImp;//只负责获取数据,显示数据,数据是如何得到的不用管import com.presenter.gang.UserInfoPresenter;public class MainActivity extends Activity implements IsShowUserView {    private TextView tv_name;    private TextView tv_age;    private TextView tv_sex;    private Button btn;    private ProgressDialog pd;    // 定义presenter层的对象    private UserInfoPresenter mUserInfoPresenter;    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        // 初始化对象,        mUserInfoPresenter = new UserInfoPresenter(this);        // 获取控件        setContentView(R.layout.activity_main);        tv_name = (TextView) findViewById(R.id.tv_name);        tv_age = (TextView) findViewById(R.id.tv_age);        tv_sex = (TextView) findViewById(R.id.tv_sex);        btn = (Button) findViewById(R.id.get_user);        pd = new ProgressDialog(this);        pd.setMessage("正在加载");        btn.setOnClickListener(new OnClickListener() {            @Override            public void onClick(View v) {                mUserInfoPresenter.dataBindView(1);            }        });    }    // 负责显示、隐藏,什么时候显示、隐藏不用管,但可以在presenter中实现    @Override    public void showLoading() {        // 显示进度条,什么时候显示我不管        pd.show();    }    @Override    public void hideLoading() {        pd.hide();    }    @Override    public void toMainActivity(User user) {        tv_name.setText(user.getName());        tv_sex.setText(user.getSex());        tv_age.setText(String.valueOf(user.getAge()));    }    @Override    public void showFailedError() {        Toast.makeText(MainActivity.this, "获取信息失败", 3000).show();    }}
1 0
原创粉丝点击