您的位置:首页 > 运维架构 > 网站架构

移动架构42_Android项目中MVP简单实现

2018-01-10 14:32 465 查看
角色:

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();
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息