MVP 反射实现

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

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值