天天看点

王学岗app架构设计-MVP

因为MVC设计架构的缺点,所以我们引入了MVP设计架构

V:视图层:

Activity作为我们的视图层,负责绘制、显示UI;用户交互但不处理,处理在presenter

P: 逻辑层:Presenter/prɪˈzentər/主持

作为View与Model的交互的中间纽带,处理与用户交互的逻辑

M:模型层:

针对业务模型,建立数据结构和相关类,model层与View层无关,与业务相关的数据的操作,针对网络的操作都应该放到model层

我们看下包与类的结构

王学岗app架构设计-MVP

大家注意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();
                } catch (InterruptedException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
                if (id == ) {
                    User user = new User();
                    user.setName("葛柳君");
                    user.setAge();
                    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();
            }
        });
    }

    // 负责显示、隐藏,什么时候显示、隐藏不用管,但可以在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, "获取信息失败", ).show();
    }
}