天天看點

使用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之間的互動
使用MVP+Retrofit+rxjava讓你的代碼更簡潔
下面看看我的代碼結構:
           
使用MVP+Retrofit+rxjava讓你的代碼更簡潔
其中的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, , );
    }
}
           
最後我們看一下我們重構的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架構實作了漫長的籌夠過程,下面我們就看一看最後的效果吧
           
使用MVP+Retrofit+rxjava讓你的代碼更簡潔
使用MVP+Retrofit+rxjava讓你的代碼更簡潔
到這裡我們已經成功的完成了所有的重構了,歡迎大家給出指導意見!
           

繼續閱讀