BaseActivity 代码
package com.test.mvp.mvpdemo.mvp.v5.basemvp;
import android.content.Context;
import android.os.Bundle;
import android.support.annotation.IdRes;
import android.support.annotation.Nullable;
import android.support.v7.app.AppCompatActivity;
import android.view.View;
import com.test.mvp.mvpdemo.mvp.v5.inject.InjectPresenter;
import java.lang.reflect.Field;
import java.util.ArrayList;
import java.util.List;
public abstract class BaseActivity<P extends IBasePresenter> extends AppCompatActivity implements IBaseView {
private P mPresenter;
/**
* 保存使用注解的 Presenter ,用于解绑
*/
private List<BasePresenter> mInjectPresenters;
protected abstract void initLayout(@Nullable Bundle savedInstanceState);
protected abstract P setPresenter();
protected abstract void initViews();
protected abstract void initData();
@SuppressWarnings("SameParameterValue")
protected <T extends View> T $(@IdRes int viewId) {
return findViewById(viewId);
}
@SuppressWarnings({"unchecked", "TryWithIdenticalCatches"})
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
initLayout(savedInstanceState);
/**
* 实例化和绑定 P 层
*/
this.mPresenter = setPresenter();
if (mPresenter != null) {
this.mPresenter.attach(this);
}
mInjectPresenters = new ArrayList<>();
//获得已经申明的变量,包括私有的
Field[] fields = this.getClass().getDeclaredFields();
for (Field field : fields) {
//获取变量上面的注解类型
InjectPresenter injectPresenter = field.getAnnotation(InjectPresenter.class);
if (injectPresenter != null) {
try {
Class<? extends BasePresenter> type = (Class<? extends BasePresenter>) field.getType();
BasePresenter mInjectPresenter = type.newInstance();
mInjectPresenter.attach(this);
field.setAccessible(true);
field.set(this, mInjectPresenter);
mInjectPresenters.add(mInjectPresenter);
} catch (IllegalAccessException e) {
e.printStackTrace();
} catch (InstantiationException e) {
e.printStackTrace();
}catch (ClassCastException e){
e.printStackTrace();
throw new RuntimeException("SubClass must extends Class:BasePresenter");
}
}
}
initViews();
initData();
}
@Override
protected void onDestroy() {
super.onDestroy();
/**
* 解绑,避免内存泄漏
*/
this.mPresenter.detach();
this.mPresenter = null;
for (BasePresenter presenter : mInjectPresenters) {
presenter.detach();
}
mInjectPresenters.clear();
mInjectPresenters = null;
}
@Override
public Context getContext() {
return this;
}
public P getPresenter(http://www.my516.com) {
return mPresenter;
}
}
---------------------
相关文章
- 温控负荷的需求响应潜力评估及其协同优化管理研究(Matlab代码实现)
- Go微服务框架go-kratos实战学习02:proto 代码生成和项目代码编写步骤
- 利用mybatis-generator自动生成代码
- 【字符串处理算法】最长连续字符及其出现次数的算法设计及C代码实现
- 在Java代码(非JSP及Action,Servlet,Controller)中获得WebRoot的物理路径
- 面向对象设计 腾讯代码案例 学习人家的模式和格式
- sublime 格式化代码
- 【软件架构】七款代码味道识别工具
- 根据时间自动切换网页背景颜色或图片代码
- .NET Core(C#)和aes.js实现AES(Crypto)加密和解密的示例代码
- Java 使用POI填充Word表格内容和复制模板行属性方法示例代码
- .NET(C#) CefSharp 执行JS(JavaScript)代码及资源清理方法
- 代码风格
- PHP代码简洁之道——SOLID原则
- asp.net发送邮件代码(Gmail、163能发)
- (转)如何基于FFMPEG和SDL写一个少于1000行代码的视频播放器