在Presenter层请求网络或者处理延迟操作过程中,用户关闭当前Activity就会造成空指针,所以每次调用View的时候都要对View做空判断。
下面使用动态代理解决空指针问题
public class BasePresenter<T extends IBaseView> implements IBasePresenter {
private SoftReference<BaseView> mReferenceView;
protected T mView;
@SuppressWarnings("unchecked")
@Override
public void attachView(T view) {
mReferenceView = new SoftReference<>(view);
this.mView = (T) Proxy.newProxyInstance(view.getClass().getClassLoader(), view.getClass().getInterfaces(), new InvocationHandler() {
@Override
public Object invoke(Object o, Method method, Object[] objects) throws Throwable {
if (mReferenceView == null || mReferenceView.get() == null) {
return null;
}
return method.invoke(mReferenceView.get(), objects);
}
});
}
@Override
public void detachView() {
mReferenceView.clear();
mReferenceView = null;
}
}