公司项目中用了MVP框架,这里进行一点总结,详细说明都在代码注释里面
项目中我喜欢按功能进行处理
先展示base包中的处理
BaseActivity
public class BaseActivity extends AppCompatActivity {
/**
* 1 进行一些Activity的公共处理
* 2 对Activity的批量管理操作
* 3 等等其他操作
*
* @param savedInstanceState
*/
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_base);
}
//你自己项目中需要进行的一些处理
}
BaseViewActivity
/**
* 为啥要弄这么一个BaseViewActivity 而不是直接用BaseActivity进行View处理
* 是为了如果有其他Activity不需要处理View但是又需要BaseActivity中其他相同部分的公共处理
* 所以就不在BaseActivity中进行处理 而是新加了BaseViewActivity
*
* @param <V>
* @param <T> 此处 T extends BasePresenter
* 是为了 presenter.setViewReference((V) this);
* 设置View
*/
public abstract class BaseViewActivity<V, T extends BasePresenter> extends BaseActivity {
protected T presenter;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_base_presenter);
presenter = getPresenter();
//
presenter.setViewReference((V) this);
}
abstract protected T getPresenter();
public void destroyView() {
if (null != presenter) {
presenter.destroyView();
presenter = null;
}
}
}
BasePresenter
public class BasePresenter<V> {
protected V view;
//弱引用 防止Activity非正常退出造成内存泄漏
private WeakReference<V> viewReference;
public void setViewReference(V view) {
viewReference = new WeakReference(view);
}
public V getView() {
if (null != viewReference)
return viewReference.get();
return null;
}
public void destroyView() {
if (null != viewReference) {
viewReference.clear();
viewReference = null;
}
}
}
____________________________分割线_________________________________
login包里面
LoginConstruct
public interface LoginConstruct {
interface LoginView {
void loginResult(String json);
}
abstract class LoginPresenter extends BasePresenter<LoginView> {
abstract void login(String url, String... args);
}
}
LoginActivity
public class LoginActivity extends
BaseViewActivity<LoginConstruct.LoginView, LoginConstruct.LoginPresenter>
implements LoginConstruct.LoginView {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_login2);
initData();
}
private void initData() {
//此处模拟数据请求工作
presenter.login("一些参数", "一些参数");
}
@Override
protected LoginConstruct.LoginPresenter getPresenter() {
// 设置presenter实例化对象
return new LoginPresenterImp();
}
@Override
public void loginResult(String json) {
//结果返进行后续处理
//...
}
@Override
protected void onDestroy() {
super.onDestroy();
//此处没有进行销毁操作
// 是在BaseViewActivity进行统一处理
}
}
LoginPresenterImp
public class LoginPresenterImp extends LoginConstruct.LoginPresenter {
@Override
public void login(String url, String... args) {
/**
* 进行网络请求,及收到结果,后续操作
* 这里我是封装的Retrofit
*/
Observer loginOB = new Observer<String>() {
@Override
public void onSubscribe(@NonNull Disposable d) {
}
@Override
public void onNext(@NonNull String s) {
//结果返回 处理结果
doLoginResult(s);
}
@Override
public void onError(@NonNull Throwable e) {
}
@Override
public void onComplete() {
}
};
NetUtils.getData(url, loginOB, args);
}
private void doLoginResult(String json) {
//拿到结果进行你需要的处理
//我就简单的直接传回View
if (null != getView())
getView().loginResult(json);
}
}
下面对比看一下是如何操作的
未完待续