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;
    }
}
--------------------- 
 
                    
                     
                    
                 
                    
                
 
                
            
         
         浙公网安备 33010602011771号
浙公网安备 33010602011771号