MVP 反射实现
2016-06-20 16:11
435 查看
1.大致思想如下:
每一个activity都有一个Presenter类对象(稍后详解),Presenter对象用来衔接逻辑层和视图操作,这就使得视图和业务逻辑完全分开。
2.具体用法:
比如登录界面有一个登录操作,我们首先定义一个登录界面的接口,里面有一个登录方法
然后我们定义一个登录业务实现,这里用线程来模拟网络请求
到这里, 登录业务逻辑完全实现好了,然后来到我们的LoginActivity中
这里我们把Presenter放到了BaseActivity中, 首先我们在activity上配置了注解指定了到底是哪个业务类,然后调用Presenter的doService方法,指定了要调用哪个业务方法,doBegin表示在执行业务之前,调用的ui方法,doAsynEnd为 前面登录业务中的EventEngine.getInstance().sendMessage(…)回调
要源码的可以加我我:657455400
每一个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
相关文章推荐
- JavaScript基础——浏览器对象模型(BOM)
- 拷贝构造函数
- CentOs 6.2 安装android studio 的问题
- 嵌入式LAB 1:启动
- Android通知Notification详解
- 剑指offer----用两个栈实现队列
- javascript局部变量与全局变量,一个实例全搞定
- anjular.js表单验证实例
- 操作命名空间
- 个人总结
- Linux 使用 iptables 禁止某些 IP 访问
- Git学习笔记05—文件基本操作
- There are eight key elements of python
- 插件搜集
- 姜承尧------ 相关站点
- .NET 中获取调用方法名
- 进程与线程
- ReactNative redux 总结
- PHP类中的成员属性和成员方法
- RSA-SHA1 signature .