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的实际使用 ,希望大家多多指点。