上一篇中主要是将mvp+rxjava+retrofit进行了结合,本篇主要是对mvp框架的优化;建议先去看上一篇:Android 搭建MVP+Retrofit+RxJava网络请求框架(二)

针对view销毁时候产生的内存泄漏,对presenter持有view的引用进行优化:

public class BasePresenter {

protected V mView;

protected Context context;

protected ApiService mApiService;

private CompositeDisposable mCompositeDisposable;

//使用弱引用

private Reference mReference = null;

public BasePresenter(V v) {

this.mView = v;

initContext();

}

private void initContext() {

if (mView instanceof Fragment) {

context = ((Fragment) mView).getActivity();

} else {

context = (Context) mView;

}

}

//关联view

public void attachView(V mvpView) {

mReference = new WeakReference(mvpView);

mApiService = RetrofitHelper.getInstance().getServer();

}

//判断是否关联

public boolean isAttach() {

return null != mReference && null != mReference.get();

}

//接触关联

public void detachView() {

if (null != mReference) {

mReference.clear();

mReference = null;

}

onUnsubscribe();

}

//RXjava取消注册,以避免内存泄露

public void onUnsubscribe() {

if (mCompositeDisposable != null && mCompositeDisposable.isDisposed()) {

mCompositeDisposable.clear();

}

}

public void addSubscription(Observable observable, DisposableObserver subscriber) {

if (mCompositeDisposable == null) {

mCompositeDisposable = new CompositeDisposable();

}

observable

.subscribeOn(Schedulers.io())

.observeOn(AndroidSchedulers.mainThread())

.subscribeWith(subscriber);

mCompositeDisposable.add(subscriber);

}

}

在view进行销毁时候,接触关联,并且使用弱引用,可以优先被gc回收;

抽出一个MvpActivity 来简化项目,让所有使用mvp结构的avtivity继承这个类,在oncreate方法中关联view,在销毁的时候进行接触关联;

public abstract class MvpActivity

extends BaseActivity implements BaseView{

protected P mvpPresenter;

@Override

protected void onCreate(Bundle savedInstanceState) {

mvpPresenter = createPresenter();

super.onCreate(savedInstanceState);

mvpPresenter.attachView(this);

}

protected abstract P createPresenter();

@Override

protected void onDestroy() {

super.onDestroy();

if (mvpPresenter != null) {

mvpPresenter.detachView();

}

}

public void showLoading() {

showProgressDialog();

}

public void hideLoading() {

dismissProgressDialog();

}

}

3.在mainActivity中继承MvpActivity

public class MainActivity extends MvpActivity implements BookInfoContract.IView {

@BindView(R.id.text)

TextView text;

@BindView(R.id.button)

Button button;

@Override

protected void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.activity_main);

bindClick();

}

@Override

protected BookPresenter createPresenter() {

return new BookPresenter(this);

}

private void bindClick() {

button.setOnClickListener(new View.OnClickListener() {

@Override

public void onClick(View view) {

//开始请求

mvpPresenter.getMsg("人间失格", null, 0, 1);

// LogUtil.e("mvpPresenter","mvpPresenter执行了");

}

});

}

@Override

public void showError(String msg) {

Toast.makeText(MainActivity.this, msg, Toast.LENGTH_SHORT).show();

}

@Override

public void showResult(String msg) {

text.setText(msg);

}

}

由于使用了retrofit+rxjava进行获取,暂时并未使用model,而是直接通过apiService进行获取Observable 后进行数据请求和回调处理;

github地址:https://github.com/cruiseliang/MvpSample

android搭建网络框架,Android 搭建MVP+Retrofit+RxJava网络请求框架(三)相关推荐

  1. Android 教你一步步搭建MVP+Retrofit+RxJava网络请求框架

    目录 1.什么是MVP? 2.什么是Retrofit? 3.RxJava 4.实践 之前公司的项目用到了MVP+Retrofit+RxJava的框架进行网络请求,所以今天特此写一篇文章以做总结.相信很 ...

  2. MVP+Retrofit+Rxjava网络请求购物车

    //依赖 compile 'com.github.bumptech.glide:glide:3.7.0' compile 'com.squareup.okhttp3:okhttp:3.9.0' com ...

  3. android+MVP+Retrofit+RxJava做网络请求

    1.MVP+Retrofit+RxJava做网络请求2.GreenDao把第一页的数据缓存到数据库,列表实现上拉加载更多,下拉刷新功能 3.列表中的图片(img字段)使用Fresco进行加载 4.Re ...

  4. Android MVP +Retrofit+RxJava

    MVP +Retrofit+RxJava这三个结合使用好像已经火了一段时间了,有时候我们只是学会了使用,却不能深刻理解.之前写过两篇关于mvp的使用跟理解的文章.感兴趣的可以看一下,这篇文章关于mvp ...

  5. kotlin 仿开眼 app 学习 kotlin mvp retrofit rxjava

    Eyepetizer 项目地址:kaikaixue/Eyepetizer  简介:kotlin 仿开眼 app 学习 kotlin mvp retrofit rxjava 更多:作者   提 Bug ...

  6. 抽基类+MVP+Retrofit+Rxjava+适配器+Recyclerview展示数据

    implementation 'com.jakewharton:butterknife:8.8.1'     annotationProcessor 'com.jakewharton:butterkn ...

  7. Android高仿网易云音乐OkHttp+Retrofit+RxJava+Glide+MVC+MVVM

    简介 这是一个使用Java(以后还会推出Kotlin版本)语言,从0开发一个Android平台,接近企业级的项目(我的云音乐),包含了基础内容,高级内容,项目封装,项目重构等知识:主要是使用系统功能, ...

  8. Retrofit+RxJava网络请求失败,报HTTP 400 Bad Request,没有返回errorBody的信息

    网络请求失败返回的结果肯定是到了onFaild()里面了,throwable获取的信息只有"HTTP 400 Bad Request",并没有返回postman上面的body信息. ...

  9. Retrofit+RxJava网络请求 对接HPH后台的接口时,利用Multipart上传文件。

    这是后台那边要求的接收到的数据结构,当时看到这个有点懵,后来百度了下,才知道了里面的原委. 直接贴出来代码: 首先在api中 @Multipart @POST("xxxx/xxxx" ...

最新文章

  1. 封装构造函数,用canvas写饼状图和柱状图
  2. wxWidgets:wxArchiveIterator类用法
  3. Java 8流中的常见SQL子句及其等效项
  4. 【js】数组置空的其他方式及使用场景
  5. 图像学习-验证码识别
  6. STL中 set 和 multiset
  7. akka mysql_初试超轻量级actor框架——akka
  8. Linux内核源代码分析——vmstat核心代码注释
  9. Map集合-根据宠物昵称查找宠物
  10. 阿里云CentOS使用iptables禁止某IP访问
  11. 简单记录jasypt使用
  12. (转载)100+个程序员开发必备参考手册(在线及下载)
  13. Elasticsearch教程(35) ik中文分词器+pinyin拼音分词器+同义词
  14. 堆栈的存取原则是什么?
  15. Jquery获取所有子元素
  16. 【react学习笔记】为什么页面只展示空标签
  17. Pr菜鸟入门教程(剪辑部分)
  18. 模拟stack/queue/priority_queue
  19. librosa、nnAudio、torchAudio三者的差异
  20. hdu6097—Mindis(计算几何)

热门文章

  1. Python关于def函数的说明
  2. windows原型设计工具_Windows的疯人性原型工具简介
  3. python之声明变量
  4. 百度相册上传下载工具
  5. 如何使用vue-cli来搭建vue项目?详细步骤跟着我来吧!
  6. Android组件化架构实践,字节跳动学习笔记
  7. if 条件判断语句的用法
  8. GRE over ipv4 详解
  9. 海量数据下如何使用多线程的导出 Excel ?
  10. Mysql基本操作(详细)