Android MVP+Retrofit+RxJava实践小结

news/2024/5/3 7:57:23 标签: java, 移动开发, ui

关于MVP、Retrofit、RxJava,之前已经分别做了分享,如果您还没有阅读过,可以猛戳:
1、Android MVP 实例
2、Android Retrofit 2.0使用
3、RxJava
4、RxBus

假设,您对MVP、Retrofit、RxJava已经有了一点了解,那么我们开始本文:

Android MVP优化

1、MVP绑定Activity(Fragment)生命周期
按照之前的文章,每个Presenter都得初始化和销毁,我新加MvpActivity(MvpFragment),加了抽象方法protected abstract P createPresenter();这样做的目的在需要使用MVP的地方,可以继承MvpActivity(MvpFragment),然后初始化和销毁就不用手动一个个去加了。

2、接口请求等还是放到MVP的P中

这个图片,在当时写MVP文章时给出的,实际开发中,我发现每个都这样写,实在是增加了不少代码,然接口请求放到P中,还有个好处,就是MVP绑定Activity(Fragment)生命周期,当onDestroy时取消RXJava注册,以避免内存泄露。

代码

目录结构

如图,有个大致了解:

mvp:所有的mvp都放在这个包下
retrofit:Retrofit接口和配置文件
rxjava:RxJava一些回调设置
ui:Activity或fragment,建议按功能再细分包

核心代码

还是就贴出核心代码吧,源码在我的github上(https://github.com/WuXiaolong/AndroidMVPSample)。

MainActivity入口,还是演示的之前的MVP的天气的接口,接口请求方法放在Presenter。

MvpActivity

Presenter绑定Activity(Fragment)生命周期

java">public abstract class MvpActivity<P extends BasePresenter> extends BaseActivity {
    protected P mvpPresenter;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        mvpPresenter = createPresenter();
        super.onCreate(savedInstanceState);
    }

    protected abstract P createPresenter();

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

MainPresenter

apiStores.loadData方法是Retrofit做的网络请求,回调是RxJava完成的。

java">public class MainPresenter extends BasePresenter<MainView> {

    public MainPresenter(MainView view) {
        attachView(view);
    }
   
    public void loadData(String cityId) {
        mvpView.showLoading();
        addSubscription(apiStores.loadData(cityId),
                new SubscriberCallBack<>(new ApiCallback<MainModel>() {
                    @Override
                    public void onSuccess(MainModel model) {
                        mvpView.getDataSuccess(model);
                    }

                    @Override
                    public void onFailure(int code, String msg) {
                        mvpView.getDataFail(msg);
                    }

                    @Override
                    public void onCompleted() {
                        mvpView.hideLoading();
                    }
                }));
    }

}

apiStores.loadData

是不是很简单,关于Retrofit配置,详见源码AppClient。

java">public interface ApiStores {
    //baseUrl
    String API_SERVER_URL = "http://www.weather.com.cn/";

    //加载天气
    @GET("adat/sk/{cityId}.html")
    Observable<MainModel> loadData(@Path("cityId") String cityId);
}

RxJava回调方法

这里onError,写了如果网络请求用httpcode来判断。当然可以不要。

java">public class SubscriberCallBack<T> extends Subscriber<T> {
    private ApiCallback<T> apiCallback;

    public SubscriberCallBack(ApiCallback<T> apiCallback) {
        this.apiCallback = apiCallback;
    }

    @Override
    public void onCompleted() {
        apiCallback.onCompleted();
    }

    @Override
    public void onError(Throwable e) {
        e.printStackTrace();
        if (e instanceof HttpException) {
            HttpException httpException = (HttpException) e;
            //httpException.response().errorBody().string()
            int code = httpException.code();
            String msg = httpException.getMessage();
            if (code == 504) {
                msg = "网络不给力";
            }
            apiCallback.onFailure(code, msg);
        } else {
            apiCallback.onFailure(0, e.getMessage());
        }
        apiCallback.onCompleted();
    }

    @Override
    public void onNext(T t) {
        apiCallback.onSuccess(t);
    }
}

BasePresenter

再来看看BasePresenter,这里做了Presenter初始化和销毁(包括RXjava取消注册),调用在MvpActivity。

java">public class BasePresenter<V> implements Presenter<V> {
    public V mvpView;
    public ApiStores apiStores = AppClient.retrofit().create(ApiStores.class);
    private CompositeSubscription mCompositeSubscription;

    @Override
    public void attachView(V mvpView) {
        this.mvpView = mvpView;
    }

    @Override
    public void detachView() {
        this.mvpView = null;
        onUnsubscribe();
    }

    //RXjava取消注册,以避免内存泄露
    public void onUnsubscribe() {
        if (mCompositeSubscription != null && mCompositeSubscription.hasSubscriptions()) {
            mCompositeSubscription.unsubscribe();
        }
    }

    public void addSubscription(Observable observable, Subscriber subscriber) {
        if (mCompositeSubscription == null) {
            mCompositeSubscription = new CompositeSubscription();
        }
        mCompositeSubscription.add(observable
                .subscribeOn(Schedulers.io())
                .observeOn(AndroidSchedulers.mainThread())
                .subscribe(subscriber));
    }
}

源码地址

https://github.com/WuXiaolong/AndroidMVPSample

总结

三者结合使用,重点还是对MVP的优化,Retrofit只贴出最简单的(后续会写Retrofit详情使用),Rxjava可能我是对它认识尚浅,实际运用最多还是RxBus。

微信公众号

我的微信公众号:吴小龙同学。


http://www.niftyadmin.cn/n/647672.html

相关文章

ev3 c语言高级编程,EV3运行原生C语言程序实例

EV3运行原生C语言程序实例。本帖最后由 ntwuhui 于 2013-9-20 07:58 编辑说明&#xff1a;以下过程直接在EV3系统上编译原生C语言程序&#xff0c;不需要修改固件&#xff0c;Ununtu13.04测试通过&#xff0c;个人觉得此法应该也可以在其他Linux系统下使用硬件需求&#xff1a;…

关于javascript中限定时间内防止按钮重复点击的思路

前面的话 有一天心血来潮&#xff0c;1分钟内重复点击了多次博客园首页的刷新博文列表的刷新按钮。果不其然&#xff0c;ip当时就被禁用了。后来&#xff0c;重启自己的路由器&#xff0c;重新获取ip才可以访问博客园主页。那么&#xff0c;设置一个限定时间内(比如1秒)防止按钮…

C语言159页练一练答案,国家计算机二级c语言历年真题及答案159页.doc

您所在位置&#xff1a;网站首页 > 海量文档&nbsp>&nbsp资格/认证考试&nbsp>&nbsp计算机等级考试国家计算机二级c语言历年真题及答案159页.doc160页本文档一共被下载&#xff1a;次,您可全文免费在线阅读后下载本文档。下载提示1.本站不保证该用户上…

值得深思(一)

006、这个世界是反应重于预测的世界&#xff0c;不要将任何一个事物看得比生活本身更重要&#xff0c;这样才不会迷失自我。 005、虚荣的准确定义是&#xff1a;刻意活在别人好评里的人。 004、一个人采取怎样的行动&#xff0c;在别人眼里会有不同的理解。但是&#xff0c;对于…

linux watch源码在哪里,Linux的watch命令没有脚本的工作

我做一个脚本定期监测到端口的连接(在这种情况下&#xff0c;80)。我写这篇简短的脚本。echo ;asudo lsof -i :80;echo $a | awk {print $1," ",$2," ",$3," ",$8}; becho $a | wc -l; b$(($b - 1));echo Total SSH Connections: $b;echo 输出是…

为什么redis官方不支持linux,为什么linux下 用./redis

满意答案jingziooo2016.02.24采纳率&#xff1a;46% 等级&#xff1a;8已帮助&#xff1a;862人Version:0.9StartHTML:-1EndHTML:-1StartFragment:00000099EndFragment:000040451、解压缩2、进入压缩文件目录&#xff0c;编译安装 make && make installmake命令执行…

关于Spring配置 (Cannot find class [org.apache.commons.dbcp.BasicDataSource] 问题)

myeclipse抛出异常 1 org.springframework.beans.factory.CannotLoadBeanClassException: Cannot find class [org.apache.commons.dbcp.BasicDataSource] for bean with name dataSource defined in URL [file:/opt/app-w/apache-tomcat-7.0.54/webapps/telemetry/WEB-INF/cla…

c语言合法浮点数,c语言中什么是浮点数

浮点型简单讲就是实数的意思。浮点数在计算机中用以近似表示任意某个实数。具体的说&#xff0c;这个实数由一个整数或定点数(即尾数)乘以某个基数(计算机中通常是2)的整数次幂得到&#xff0c;这种表示方法类似于基数为10的科学记数法。浮点表示法&#xff1a;把一个数的有效数…