因为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();
} 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();
}
}