上一篇文章[使用Retrofit和Rxjava讓你的網絡請求更簡單](http://blog.csdn.net/yanglei0917/article/details/60964151),已經講述了retrofit和rxjava的結合讓你的網絡請求變得不咋那麼複雜,而且代碼量清晰,高度解耦。在本篇文章中是繼上一篇中的重構,因為mvp模式是當下解耦更加完全的模式,相比MVC更加簡單好用
下面看看什麼是mvp:
- View:對應Activity,負責View的顯示繪制以及使用者的互動
- Model:業務邏輯和實體模型
- 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, , );
}
}
最後我們看一下我們重構的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架構實作了漫長的籌夠過程,下面我們就看一看最後的效果吧
到這裡我們已經成功的完成了所有的重構了,歡迎大家給出指導意見!