MVP框架(POST请求)

一 .myLibrary内容不变 

BasePresenter层

package com.baicai.mylibrary.presenter;

import java.lang.ref.WeakReference;

import io.reactivex.disposables.CompositeDisposable;

/**
 * 由于使用MVP可能会遇到内存泄漏的问题,所以需要使用引用的形式来处理,当内存对象被回收时,可以及时回收P层,避免内存泄漏
 * 强引用:User user = new User()强引用,就是最普通的引用形式,如果一个对象具有强引用,那垃圾回收(GC)宁可抛出异常(OOM)也不会回收它
 * 软引用:SoftReference<String>username 在内存不足时会被回收,不会OOM
 * 弱引用:WeakReference<String> username 当发生GC时,会直接回收掉弱引用对象,不管空间是否足够,都会回收
 * 虚引用:PhantomReference 幽灵引用,尽量不要用,没有办法去实例一个对象,对这个对象的生命周期完全没有影响
 *
 * V代表V层
 *
 */
public class BasePresenter<V> {
    WeakReference<V> weakReference;//使用弱引用声明一个V层,当发生GC时,可以回收掉

    protected CompositeDisposable disposable=new CompositeDisposable();//作为P层的回收条件使用,避免P层出现内存泄漏

    //当声明一个V层的时候,需要把这个V层加入到软引用当中
    public void attachView(V view){
        if(weakReference==null){
            weakReference=new WeakReference<V>(view);
        }
    }

    //当一个V层进行销毁时,需要置空V层和P层的声明
    public void distach(){
        if (weakReference!=null){
            weakReference.clear();
            weakReference=null;
        }
        if (disposable!=null){
            disposable.clear();
            disposable=null;
        }
    }

    //此方法用于判断当前的V层是否加入到了软引用,weakReference.get()相当于取出V层
    public Boolean isAttach(){
        return weakReference!=null&&weakReference.get()!=null;
    }

    //从软引用中取出当前的View
    public V getView(){
        if (weakReference!=null&&weakReference.get()!=null){
            return weakReference.get();
        }
        return null;
    }
}

 BaseActivity层

package com.baicai.mylibrary.view;

import androidx.appcompat.app.AppCompatActivity;

import android.os.Bundle;

import com.baicai.mylibrary.presenter.BasePresenter;

public abstract class BaseActivity<V,P extends BasePresenter<V>> extends AppCompatActivity {
    protected P presenter;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(bindLayoutId());
        initView();
        initData();
        if (presenter!=null) {
            presenter.attachView((V)this);
        }
    }

    protected abstract void initData();

    protected abstract void initView();
    protected abstract int bindLayoutId();

    @Override
    protected void onDestroy() {
        super.onDestroy();
        if (presenter!=null) {
            presenter.distach();
        }
    }
}

BaseFragment层

package com.baicai.mylibrary.view;

import android.os.Bundle;

import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.fragment.app.Fragment;

import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;

import com.baicai.mylibrary.R;
import com.baicai.mylibrary.presenter.BasePresenter;


public abstract class BaseFragment<V,P extends BasePresenter<V>> extends Fragment {
    protected P presenter;
    protected View inflate;
    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {

         inflate = inflater.inflate(bindLayoutId(), container, false);

        return inflate;
    }

    protected abstract int bindLayoutId();


    @Override
    public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) {
        super.onViewCreated(view, savedInstanceState);
        initView();
        initData();
        if (presenter!=null) {
            presenter.attachView((V)this);
        }
    }

    protected abstract void initData();

    protected abstract void initView();

    @Override
    public void onDestroy() {
        super.onDestroy();
        if (presenter!=null){
            presenter.distach();
        }

    }
}

二 . 

 ApiService层

package com.baicai.day03rk;

import io.reactivex.Observable;
import retrofit2.http.POST;
import retrofit2.http.Query;

public interface ApiService {
    @POST("/foods/postFoods")
    Observable<FoodBean> postFood(@Query("currentPage") String currentPage,
                                  @Query("pageSize") String pageSize);
}

BaseModel层

package com.baicai.day03retrofit_mvp_demo.base;

import com.baicai.day03retrofit_mvp_demo.ApiService;
import com.baicai.day03retrofit_mvp_demo.RetrofitManager;

public class BaseModel {
    protected ApiService apiService;

    public BaseModel(){
        //拿到整个项目的接口实现
        apiService= RetrofitManager.getInstance().getRetrofit().create(ApiService.class);
    }
}

RegisterContract协议层

package com.baicai.day03retrofit_mvp_demo.register.presenter;

import com.baicai.day03retrofit_mvp_demo.bean.UserRegisterBean;

import io.reactivex.Observable;

/**
 * 协议层,主要给MVP所有的功能和接口进行拆分
 */
public interface RegisterContract {
    //M层 主要功能负责网络请求返回bean类
    interface Model{
        Observable<UserRegisterBean> register(String userName, String password, String rePassword);
    }

    //P层,主要功能负责触发网络连接
    interface Presenter{
        void register(String userName, String password,String rePassword);
    }

    interface View{
        void onRegisterSuccess(UserRegisterBean userRegisterBean);

        void onRegisterFailed(String error);
    }
}

RegisterModel层

package com.baicai.day03retrofit_mvp_demo.register.model;



import com.baicai.day03retrofit_mvp_demo.bean.UserRegisterBean;
import com.baicai.day03retrofit_mvp_demo.base.BaseModel;
import com.baicai.day03retrofit_mvp_demo.register.presenter.RegisterContract;

import io.reactivex.Observable;

public class RegisterModel extends BaseModel implements RegisterContract.Model {

    @Override
    public Observable<UserRegisterBean> register(String userName, String password, String rePassword) {
        return apiService.register(userName, password, rePassword);
    }
}

RegisterPresenter层

package com.baicai.day03retrofit_mvp_demo.register.presenter;

import com.baicai.day03retrofit_mvp_demo.bean.UserRegisterBean;
import com.baicai.day03retrofit_mvp_demo.register.model.RegisterModel;
import com.baicai.mylibrary.presenter.BasePresenter;

import io.reactivex.Observer;
import io.reactivex.android.schedulers.AndroidSchedulers;
import io.reactivex.disposables.Disposable;
import io.reactivex.schedulers.Schedulers;

public class RegisterPresenter extends BasePresenter<RegisterContract.View> implements RegisterContract.Presenter {
    RegisterModel registerModel=new RegisterModel();

    @Override
    public void register(String userName, String password, String rePassword) {
        registerModel.register(userName, password, rePassword)
                .subscribeOn(Schedulers.io())//执行耗时操作时,在IO线程中,也就是子线程
                .observeOn(AndroidSchedulers.mainThread())//当观测对象发生改变时,运行在UI线程
                .subscribe(new Observer<UserRegisterBean>() {
                    @Override
                    public void onSubscribe(Disposable d) {
                        //这个会回调填写P防止内存泄漏
                        disposable.add(d);
                    }

                    @Override
                    public void onNext(UserRegisterBean userRegisterBean) {
                        //请求回调的结果,会回调bean出来
                        if (isAttach()){
                            //如果当前View层已经绑定过在弱引用中,则咱们可以获取到View
                            getView().onRegisterSuccess(userRegisterBean);
                        }
                    }

                    @Override
                    public void onError(Throwable e) {
                        //请求发生错误时的回调
                        getView().onRegisterFailed(e.getMessage());
                    }

                    @Override
                    public void onComplete() {
                        //请求完成时发生的回调
                    }
                });
    }

}

RegisterActivity

package com.baicai.day03retrofit_mvp_demo.register.view;

import android.view.View;
import android.widget.EditText;
import android.widget.Toast;

import com.alibaba.android.arouter.launcher.ARouter;
import com.baicai.day03retrofit_mvp_demo.R;
import com.baicai.day03retrofit_mvp_demo.bean.UserRegisterBean;
import com.baicai.day03retrofit_mvp_demo.register.presenter.RegisterContract;
import com.baicai.day03retrofit_mvp_demo.register.presenter.RegisterPresenter;
import com.baicai.mylibrary.view.BaseActivity;

public class RegisterActivity extends BaseActivity<RegisterContract.View, RegisterPresenter> implements RegisterContract.View{
    private EditText name,pass,repass;

    @Override
    public void onRegisterSuccess(UserRegisterBean userRegisterBean) {
        if (userRegisterBean.getErrorCode()==200){
            Toast.makeText(this, "注册成功", Toast.LENGTH_SHORT).show();
        }
    }

    @Override
    public void onRegisterFailed(String error) {
        Toast.makeText(this, "error:"+error, Toast.LENGTH_SHORT).show();
    }
    @Override
    protected void initData() {
        presenter=new RegisterPresenter();
    }

    @Override
    protected void initView() {
        name=findViewById(R.id.et);
        pass=findViewById(R.id.et2);
        repass=findViewById(R.id.et3);
    }

    @Override
    protected int bindLayoutId() {
        return R.layout.activity_register;
    }


    public void bt(View view) {
        String username = name.getText().toString();
        String password = pass.getText().toString();
        String repassword = repass.getText().toString();
        presenter.register(username, password, repassword);
        ARouter.getInstance().build("/login/activity")
                .withString("username", username)
                .withString("password", password)
                .navigation();
    }
}

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值