使用反射、rxjava、okhttp等技术实现的mvp架构

android 的 mvp 架构  已经出来许久了 我就不阐述了

我这只讲下我的mvp的特色:

1、实现model 的有参数构造  进行初始化  

model层:

实现有参无参的构造函数:

public MvpTest3Model()
    {
        Log.e("MvpTest3Model: ", "无参构造");
    }

    public MvpTest3Model(String id,Integer i)
    {
        Log.e("MvpTest3Model: ", "有参 : " + id + "参数2 :" + i);
    }

    public MvpTest3Model(Integer id)
    {
        Log.e("MvpTest3Model: ", "有参 : " + id );
    }

persenter层:

Class aClass1 = Class.forName(path + clazzName);
        Constructor constructor = getConstructorInit(aClass1, objects);  //获取需要的构造器 进行初始化
        model = (BaseModel) constructor.newInstance(objects);

通过获取Class的方法并遍历  匹配相同参数类型 的构造器  获取需要执行的构造

public Constructor getConstructorInit(Class aClass1,Object[] objects) throws Exception
    {

        if(objects.length<=0)
        {
            return aClass1.getDeclaredConstructor();
        }

        Constructor[] constructors = aClass1.getDeclaredConstructors();
        Constructor real = null;
        boolean initConstructor = Boolean.FALSE;
        for(int i=0;i<constructors.length;i++)
        {
            Class[] parameterTypes = constructors[i].getParameterTypes();
            for(int j = 0;j<parameterTypes.length;j++)
            {
                Class param = parameterTypes[j];
                Class objectClass = objects[j].getClass();
                if(!param.equals(objectClass))
                {
                    initConstructor = Boolean.FALSE;
                    break;
                }else{
                    initConstructor = Boolean.TRUE;
                }
            }
            if(initConstructor)
            {
                real = constructors[i];
                break;
            }
        }
        return real;
    }

view层:

presenter = new BasePresenter();
        try {
            //调用Model的无参构造
            presenter.attachView(this,"MvpTest3Model",new Object[]{});

//            调用Model的有参构造  使得model初始化
//            presenter.attachView(this,"MvpTest3Model",new Object[]{222});
        } catch (Exception e) {
            e.printStackTrace();
        }

链接presenter层时,传入初始化参数   以便presenter进行反射比较  获取model层的相应构造函数  进行model的创建  

注意事项:    model层 的构造函数里面的参数类型  基本类型必须是  包装类

 

2、实现 callback 回调 :

basemodel  中:

public interface BaseCallBack
    {
        void success(JSONObject data);

        void fail(String msg);
    }

    public BaseCallBack callBack;

    public void setOnCallBack(BaseCallBack callBack)
    {
        this.callBack = callBack;
    }

加入BaseCallBack  接口 以便实际的 model层  进行回调

实际的model:

JSONObject response = null;
        try {
            response = new JSONObject();
            response.put("error",-1);
            response.put("reason","fail");
            response.put("data","yanjun");
        } catch (JSONException e) {
            e.printStackTrace();
        }
        callBack.success(response);

presenter层

model.setOnCallBack(new BaseModel.BaseCallBack() {    //设置回调  使得异步返回操作 方便presenter操作activity等
            @Override
            public void success(JSONObject data) {
                if(isTach())
                    weakReference.get().showDataFromSuccess(data);

                Log.e("success:", data.toString());
            }

            @Override
            public void fail(String msg) {
                if(isTach())
                    weakReference.get().showDataFromFail(msg);
            }
        });

这样  presenter  在创建实际的model时,就可以匿名内部类实现callback  从而实现异步

 

3、rxjava和OKhttp实现异步请求操作:

Observable.create(new ObservableOnSubscribe<String>() {
            @Override
            public void subscribe(final ObservableEmitter<String> e) throws Exception {
                CloseableHttpClient httpClient = HttpClients.createDefault();

                String url = "http://10.0.192.106:80/uauth/XUserLogin.api";

                JSONObject request = new JSONObject();
                request.put("username", "yanjun");
                request.put("password", "1");
                final String[] ss = {""};

                OkHttpClient OkHttpClient = new OkHttpClient();

                //使用post键值对
                //                FormBody body = new FormBody
                //                        .Builder()
                //                        .add("username","yanjun")
                //                        .add("password","1")
                //                        .build();

                //post字符串
                RequestBody body = RequestBody.create(MediaType.parse("text/plain;charset=utf-8"),
                        request.toString());

                Request req = new Request.Builder()
                        .post(body)
                        .url(url)
                        .build();

                Call call = OkHttpClient.newCall(req);
                call.enqueue(new Callback() {
                    @Override
                    public void onFailure(Call call, IOException e) {
                        //请求失败调用
                    }

                    @Override
                    public void onResponse(Call call, Response response) throws IOException {
                        ResponseBody body=response.peekBody(1024*1024);
                        if (body!=null){
                            //                            Log.e(TAG,"protocol: "+body.string());
                            ss[0] = body.string();
                            e.onNext(ss[0]);

                            //  这种方式 直接子线程 通过回调通知
//                            try {
//                                callBack.success(new JSONObject(body.toString()));
//                            } catch (JSONException e1) {
//                                e1.printStackTrace();
//                            }
                        }
                    }
                });
            }
        }).subscribeOn(Schedulers.io())   //子线程执行网络请求
        .observeOn(AndroidSchedulers.mainThread())   //主线程执行更新页面操作
        .subscribe(new Consumer<String>() {
            @Override
            public void accept(String s) throws Exception {
                callBack.success(new JSONObject(s));
            }
        });

4、通过反射技术实现相应的方法调用:

public void getReturn(String method,Object... objects) throws Exception
    {
        Class aClass1 = Class.forName(path + clazzName);
        Method[] methods = aClass1.getMethods();  //获取公共的方法  匹配  执行
        for(int i = 0;i<methods.length;i++)
        {
            if(methods[i].getName().equals(method))
            {
                methods[i].invoke(model, objects);
                break;
            }
        }

    }

通过便利所有的方法  匹配 方法名  获取到需要执行的方法 再invoke

在view层中执行:

presenter.getReturn("init",new Object[]{});

这是我使用反射、rxjava、okhttp等技术的mvp的实际使用  ,希望大家多多指点。

demo下载

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值