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

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();

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值