您的位置:首页 > 其它

MVP 反射实现

2016-06-20 16:11 435 查看
1.大致思想如下:

每一个activity都有一个Presenter类对象(稍后详解),Presenter对象用来衔接逻辑层和视图操作,这就使得视图和业务逻辑完全分开。

2.具体用法:

比如登录界面有一个登录操作,我们首先定义一个登录界面的接口,里面有一个登录方法

/***
* 用户的 业务逻辑
* @author Administrator
*
*/
public interface ILoginService extends IService{

/**
* 登录
* @param user
*/
public void login(User user);
}


然后我们定义一个登录业务实现,这里用线程来模拟网络请求

public class LoginServiceImpl implements ILoginService{

public LoginServiceImpl() {
}
@Override
public void login(final User user) {
new Thread(){
public void run() {
// 模拟网络请求
try {
Thread.sleep(5000);
} catch (InterruptedException e) {
e.printStackTrace();
}
if(new Random().nextBoolean()){  //网络 请求出错 , 回送错误信息
EventEngine.getInstance().sendMessage(1, // 通知界面,需要界面调用Presenter 的doAsynEnd方法 来注册
Error.newInstance()
.putError(Error.ERROR_CODE, 10001)
.putError(Error.ERROR_MESSAGE, "网络下载错误") ); // 通知界面层
}else{
// 请求完成 ,得到 json数据
EventEngine.getInstance().sendMessage(1, user.jsonParser("json datas"));  //通知界面层
}
};
}.start();
}
}


到这里, 登录业务逻辑完全实现好了,然后来到我们的LoginActivity中

@MVPAnno(service=LoginServiceImpl.class)
public class LoginActivity extends BaseActivity implements LoginMVPView{
@Luo(id=R.id.et_username)
private EditText et_username ;
@Luo(id=R.id.et_password)
private EditText et_password ;
@Luo(id=R.id.btn_login)
private Button btn_login;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
FindViewById.init(this);

btn_login.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
long start = System.currentTimeMillis();
/**
* 以下 为 执行 登录的 业务操作, 分为三个流程:
* 1.发出请求之前,执行UI操作 ( 执行showLoginDialog方法 )
* 2.执行登录的业务逻辑 (调用 IUserService 的login 方法,并传递参数 user)
* 3.doAsynEnd 服务器回调
*/
presenter.doBegin("ui_LoginBegin") // 执行 登录业务之前,改变的UI
.doService("login", new User(et_username.getText().toString(),et_password.getText().toString())
,"ssssssssssssss")//执行登录业务
.doAsynEnd(1,new EventListener() { // 登录异步业务的回调
@Override
public void onEvent(Object obj) {
if(obj instanceof Error){  // 请求错误,服务层,返回的 是 error
ui_LoginEnd((String) ((Error)obj).getError(Error.ERROR_MESSAGE));
}else{  //请求成功, 转对应的 bean对象
ui_LoginEnd("登录成功: " + ((User)obj).getUserName());
}
}
});
// 测试反射方法 调用时间 是否过长 , 10ms左右
Toast.makeText(getApplicationContext(),"执行时间 : " +  (System.currentTimeMillis()-start) + " 毫秒" ,Toast.LENGTH_SHORT).show();
}
});
}
@Override
public void ui_LoginBegin() {
Toast.makeText(getApplicationContext(),"开始 登录...",Toast.LENGTH_SHORT).show();
}
@Override
public void ui_LoginEnd(String info) {
Toast.makeText(getApplicationContext(),info,Toast.LENGTH_SHORT).show();
}
@Override
public void initPresenter() {
super.presenter = Presenter.newInstance(this, true);
}
}


这里我们把Presenter放到了BaseActivity中, 首先我们在activity上配置了注解指定了到底是哪个业务类,然后调用Presenter的doService方法,指定了要调用哪个业务方法,doBegin表示在执行业务之前,调用的ui方法,doAsynEnd为 前面登录业务中的EventEngine.getInstance().sendMessage(…)回调

要源码的可以加我我:657455400
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: