使用MVP+Retrofit+rxjava让你的代码更简洁

上一篇文章[使用Retrofit和Rxjava让你的网络请求更简单](http://blog.csdn.net/yanglei0917/article/details/60964151),已经讲述了retrofit和rxjava的结合让你的网络请求变得不咋那么复杂,而且代码量清晰,高度解耦。在本篇文章中是继上一篇中的重构,因为mvp模式是当下解耦更加完全的模式,相比MVC更加简单好用

下面看看什么是mvp:

  1. View:对应Activity,负责View的显示绘制以及用户的交互
  2. Model:业务逻辑和实体模型
  3. Presenter:负责完成View与Model之间的交互

盗用了一鸿洋大神的博客图

下面看看我的代码结构:

我的代码结构

    其中的Model ,adapter和api中的代码没有变化还是上一篇文章的代码,这里新添加了presenter以及其实现类impl包,View包,重构了上一篇的代码

    下面就是mvp实现的过程了,首先要创建一个View包,在创建一个接口类和他对应的activity同名,这里我们叫MainView,下面看看MainView的代码吧
package ledon.com.retrofitdemo.view;

import java.util.List;

import ledon.com.retrofitdemo.MovieBean;

/**
 * Created by Administrator on 2017/3/13.
 */

public interface MainView {
    void onClickGetMovie(List<MovieBean.SubjectsBean>list,boolean success);
}
接下来就看一看我们的presenter层的实现了,MainPersenter的接口:
package ledon.com.retrofitdemo.presenter;

/**
 * Created by Administrator on 2017/3/13.
 */

public interface MainPresenter {
    void clickGetMovie();
}
接下来看看presenter的实现类MainPresenterImpl,这个类要实现MainPresenter接口,具体实现代码如下:
package ledon.com.retrofitdemo.presenter.impl;

import android.widget.Toast;

import java.util.List;

import ledon.com.retrofitdemo.MainActivity;
import ledon.com.retrofitdemo.MovieBean;
import ledon.com.retrofitdemo.adapter.MovieAdapter;
import ledon.com.retrofitdemo.api.HttpMethods;
import ledon.com.retrofitdemo.presenter.MainPresenter;
import ledon.com.retrofitdemo.view.MainView;
import rx.Subscriber;

/**
 * Created by Administrator on 2017/3/13.
 */

public class MainPresenterImpl implements MainPresenter {
    private MainView mainView;
    private Subscriber<MovieBean> subscriber;
    private List<MovieBean.SubjectsBean> list;

    public MainPresenterImpl(MainView mainView) {
        this.mainView = mainView;

    }

    @Override
    public void clickGetMovie() {
        getMovie();
    }

    /**
     * 获取电影的列表
     */
    private void getMovie() {
        subscriber = new Subscriber<MovieBean>() {
            @Override
            public void onCompleted() {

            }

            @Override
            public void onError(Throwable e) {

                mainView.onClickGetMovie(null,false);
            }

            @Override
            public void onNext(MovieBean movieBean) {
                list = movieBean.getSubjects();
                //把集合传到Activity 让listview显示出来
                mainView.onClickGetMovie(list,true);

            }
        };
        HttpMethods.getInstance().getTopMovie(subscriber, 0, 10);
    }
}
最后我们看一下我们重构的MainActivity了,我们要在里边实现MainView这个接口,在onCreate里边 new 出来这个实体presenter = new MainPresenterImpl(this);当我们点击获取网络数据的按钮的时候,在onclick中添加presenter.clickGetMovie();

下面我们看一下最终的实现了:
package ledon.com.retrofitdemo;

import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.support.v7.widget.LinearLayoutManager;
import android.support.v7.widget.RecyclerView;
import android.widget.Button;
import android.widget.ListView;
import android.widget.RelativeLayout;
import android.widget.Toast;

import java.util.List;

import butterknife.Bind;
import butterknife.ButterKnife;
import butterknife.OnClick;
import ledon.com.retrofitdemo.adapter.MovieAdapter;
import ledon.com.retrofitdemo.api.HttpMethods;
import ledon.com.retrofitdemo.presenter.MainPresenter;
import ledon.com.retrofitdemo.presenter.impl.MainPresenterImpl;
import ledon.com.retrofitdemo.view.MainView;
import rx.Subscriber;

public class MainActivity extends AppCompatActivity implements MainView{


    @Bind(R.id.click_me_BN)
    Button clickMeBN;
    @Bind(R.id.result_TV)
    ListView resultTV;
    @Bind(R.id.activity_main)
    RelativeLayout activityMain;
    private MainPresenter presenter;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        ButterKnife.bind(this);

        presenter = new MainPresenterImpl(this);

    }


    /**
     * 点击获取网络数据
     */
    @OnClick(R.id.click_me_BN)
    public void onClick() {
        presenter.clickGetMovie();
    }


    /**
     * 利用mvp模式来判断是否网络请求成功
     * @param list
     * @param success
     */
    @Override
    public void onClickGetMovie(List<MovieBean.SubjectsBean> list, boolean success) {
            if (success){
                MovieAdapter movieAdapter = new MovieAdapter(MainActivity.this, list);
                resultTV.setAdapter(movieAdapter);
            }else{
                Toast.makeText(this,"请求失败",Toast.LENGTH_SHORT).show();
            }

    }
}
经过漫长的重构,我们的MVP+Retrofit+Rxjava框架实现了漫长的筹够过程,下面我们就看一看最后的效果吧

点击前

点击后获取到的数据

到这里我们已经成功的完成了所有的重构了,欢迎大家给出指导意见!
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值