一 .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();
}
}