Android移动架构汇总
角色:
Contact 规范V和P的操作,将其放到一起管理
View 页面层行为的抽取(可以有父接口)
Presenter 网络层行为的抽取(可以有父接口)
##1 Contact
public class FunctionContact {
public interface View extends BaseView<Presenter> {
/**
* 刷新UI数据
*/
void setUI(String msg);
/**
* View层是否存在(如:Fragment的isAdded)
*
* @return
*/
boolean isActive();
}
public interface Presenter extends BasePresenter {
/**
* 请求网络
* @param param 请求参数
*/
void requestData(String param);
}
}
##2 View
public interface BaseView<T> {
void setPresenter(T presenter);
}
##3 Presenter
public interface BasePresenter {
/**
* 加入请求时,具体看业务逻辑调用
*/
void subscribe();
/**
* 取消请求
*/
void unsubscribe();
}
##4 具体实现Presenter 和View
public class FunctionPresenter implements FunctionContact.Presenter {
private final FunctionContact.View view;
private Context mContext;
public FunctionPresenter(Context context,FunctionContact.View view){
mContext = context;
this.view = view;
this.view.setPresenter(this);
}
@Override
public void subscribe() {
}
@Override
public void unsubscribe() {
//清除网络请求的逻辑
}
@Override
public void requestData(String param) {
if(view.isActive()){
//发出请求,
//.. 请求回调后..
view.setUI("回调的数据");
//.....
}
}
}
public class MainActivity extends AppCompatActivity implements FunctionContact.View {
private FunctionContact.Presenter presenter;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
new FunctionPresenter(getApplicationContext(),this);
}
@Override
public void onContentChanged() {
presenter.requestData("参数");
}
@Override
public void setPresenter(FunctionContact.Presenter presenter) {
this.presenter = presenter;
}
@Override
public void setUI(String msg) {
//页面显示UI
}
@Override
protected void onDestroy() {
super.onDestroy();
presenter.unsubscribe();
}
@Override
public boolean isActive() {
//Activity销毁时,不请求
return isFinishing();
}
}
##5 拓展
可以在subscribe和unsubscribe来取消网络,从而防止页面关闭时,还去刷新UI造成View泄漏,或View为null异常;
例如Retrofit+RxJava实现网络请求时:
###(1)请求时:
判断页面是否存在,然后将网络添加管理
CompositeDisposable disposables = new CompositeDisposable(); disposables.add(observable.subscribeWith(observer));
###(2)页面销毁是,清空请求
disposables.clear();