公司項目中用了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);
}
}
下面對比看一下是如何操作的
未完待續