android的開發模式,也就是項目最基本的構模組化式,也不是說需要固定不變的模式,在項目中可以靈活運用。
而MVP開發模式屬于MVC的變種更新,其相對于mvc模式來說,更高度的解耦,更明确的分工,可以更好的開發項目,結構十厘清晰,适合安卓更新之後包括android5.0,6.0的開發,
mvp同樣是有名字組成,model(模型),view(視圖),presenter(紐帶),其三者之間的關系,大緻是有如下圖一樣的關系:
即最早是view與presenter最先互動,然後model直接與presenter直接互動,然後再通過presenter與view傳回互動,三者之間presenter于兩者互互相動,而model與view沒有直接的互動,這是不同于mvc的循環互動模式。
然後做了一個小demo通過該模式,來講解該開發模式
然後我們直接來看項目設計,通過代碼來了解MVP模式的使用
model,就是該項目的邏輯處理的詳細分工,如下:
該model為根據使用者需求,通過接手personter傳遞給我們的需要進而傳回,背景傳遞給我們的實體類
bean中檔案為,建立類,biz提供接口做網絡請求的主要操作,service提供api的作用,根據mvp與rxjava和retrofit的網絡請求。
先從business入手。
public interface IBusiness {
/**
* 注冊
* @param mUserVo:請求參數:封裝為bean
* @param mICallBackListener:回調接口
*/
public void search(String key, ICallBackListener mICallBackListener);
}
//
public class Business implements IBusiness {
@Override
public void register(String key, ICallBackListener mICallBackListener) {
IServiceAPI mIServiceAPI = HttpDao.getInstance().getIServiceAPI();
mIServiceAPI.register(key)
// Subscriber前面執行的代碼都是在I/O線程中運作
.subscribeOn(Schedulers.io())
// 操作observeOn之後操作主線程中運作.
.observeOn(AndroidSchedulers.mainThread())
.subscribe(HttpDao.getInstance().createSubscriber(mICallBackListener));
}
}
這是直接從presenter調用的方法,裡面通過service裡面的服務進行
public interface IServiceAPI {
// 注冊
@FormUrlEncoded
@POST("words")
Observable<String> (@Field("key") String key);
}
callbacklinseter中的方法,即
public interface ICallBackListener {
public void onSuccess(CallBackVo mCallBackVo);
public void onFaild(CallBackVo mCallBackVo);
}
CallBackVo即傳回的資料基本類型
public class CallBackVo {
String error_code;
String reason;
Object result;
public String getError_code() {
return error_code;
}
public void setError_code(String error_code) {
this.error_code = error_code;
}
public String getReason() {
return reason;
}
public void setReason(String reason) {
this.reason = reason;
}
public Object getResult() {
return result;
}
public void setResult(Object result) {
this.result = result;
}
}
然後就是httpdao層的
public class HttpDao {
private static final String TAG = HttpDao.class.getSimpleName();
private static HttpDao mHttpDao = null;
private HttpDao(){};
public static HttpDao getInstance(){
if (mHttpDao == null) {
mHttpDao = new HttpDao();
}
return mHttpDao;
}
/**
* 擷取 IServiceAPI實列
* @return IServiceAPI
*/
public IServiceAPI getIServiceAPI() {
// 使用自定義轉換器
Gson mGson = new GsonBuilder()
.registerTypeAdapter(String.class, new DeserializerData())
.create();
Retrofit mRetrofit = new Retrofit.Builder()
.baseUrl(AppConstant.URL_HOST)
.addConverterFactory(GsonConverterFactory.create(mGson))
//build.gradle引入:compile 'com.squareup.retrofit2:adapter-rxjava:2.0.0-beta4'
.addCallAdapterFactory(RxJavaCallAdapterFactory.create())
.build();
return mRetrofit.create(IServiceAPI.class);
}
/**
* 建立 Subscriber
* @param mICallBackListener
* @return Subscriber
*/
public Subscriber createSubscriber(final ICallBackListener mICallBackListener) {
Subscriber mSubscriber = new Subscriber<String>() {
@Override
public void onCompleted() {
Log.i(TAG, "[onCompleted]");
}
@Override
public void onError(Throwable e) {
Log.e(TAG, "[onError]" + e.getMessage());
CallBackVo mCallBackVo = new CallBackVo();
mCallBackVo.setError_code("400");
mCallBackVo.setReason("請求失敗");
mCallBackVo.setResult(null);
mICallBackListener.onFaild(mCallBackVo);
return;
}
@Override
public void onNext(String s) {
Log.i(TAG, "[onNext]" + s);
Gson gosn = new Gson();
CallBackVo mCallBackVo = gosn.fromJson(s, CallBackVo.class);
if (mCallBackVo.getError_code().equals(AppConstant.REQUEST_SUCCESS_CODE)) {
mICallBackListener.onSuccess(mCallBackVo);
} else {
mICallBackListener.onFaild(mCallBackVo);
}
}
};
return mSubscriber;
}
}
view層,就是該項目與使用者進行互動的主要負責,擷取使用者需求,顯示使用者需要,如下:
activity即為基本的activity
@EActivity(R.layout.activity_fragment_main_toolbar)
public class TestActivity extends AxBaseFragmentActivity {
private TestFragment mTestFragment;
@AfterViews
public void initView()
{
mTestFragment = (TestFragment) getSupportFragmentManager().findFragmentById(R.id.contentFrame);
if (mTestFragment == null) {
//
mTestFragment = TestFragment_.builder().build();
//
addFragmentToActivity(getSupportFragmentManager(), mTestFragment, R.id.contentFrame);
}
// Create the presenter
new TestPresenter(mTestFragment);
}
}
然後delegate,主要是定義view層和personter層需要的方法,進行統一管理
public interface TestDelegate {
interface View extends AxBaseDelegate.AxIView<Presenter>,AxBaseDelegate.AxIFragment{
public void closeProgress();
public void showProgress();
public String getParamenters();
public void excuteSuccessCallBack(CallBackVo mCallBackVo);
public void excuteFailedCallBack(CallBackVo mCallBackVo);
}
interface Presenter extends AxBaseDelegate.AxIPresenter{
public IBusiness mIBusiness = new Business();
public Handler mHandler = new Handler();
}
}
然後是fragment中的
@EFragment(R.layout.mainlayout)
public class TestFragment extends BaseFragment implements TestDelegate.View{
private TestDelegate.Presenter mPresenter;
private Dialog mDialog;
@ViewById
RecyclerView recyclerView;
@AfterViews
public void initview(){
}
@Override
public void initPresenter(TestDelegate.Presenter presenter) {
mPresenter = presenter;
}
@Override
public String getParamenters() {
return "3addff781b814fa48142f76922dca6df";
}
@Override
public void excuteSuccessCallBack(CallBackVo mCallBackVo) {
List<UserVo.ResultEntity> mUserVo = (List<UserVo.ResultEntity>) mCallBackVo.getResult();
NewsAdapter newsAdapter = new NewsAdapter(getActivity(),mUserVo);
recyclerView.setLayoutManager(new LinearLayoutManager(getActivity()));
recyclerView.setAdapter(newsAdapter);
for (int i = 0; i < mUserVo.size(); i++) {
Log.e("TAg","--"+mUserVo.get(i).Id);
Log.e("TAg","--"+mUserVo.get(i).KeyWord);
}
}
@Override
public void excuteFailedCallBack(CallBackVo mCallBackVo) {
Log.e("TAG",mCallBackVo.getReason());
}
@Click({R.id.btn})
public void onClick(View view){
if (view.getId() == R.id.btn){
AppConstant.URL_HOST = "http://apis.haoservice.com/lifeservice/news/";
mPresenter.init();
Log.e("Tag","----------");
//測試圖檔加載
// Glide.with(getActivity())
// .load("https://ss0.bdstatic.com/94oJfD_bAAcT8t7mm9GUKT-xh_/timg?image&quality=100&size=b4000_4000&sec=1471937376&di=bc91d6b0a8668d4df18a52f87c5e1c8d&src=http://img03.tooopen.com/images/20130516/tooopen_06463339.jpg")
// .error(R.drawable.ic_launcher)
// .placeholder(R.drawable.actionbar_add_btn)
// .into(iv);
// UgcTvApp.getInstance().getAxImageLoader().displayImage(getActivity(), "https://ss0.bdstatic.com/94oJfD_bAAcT8t7mm9GUKT-xh_/timg?image&quality=100&size=b4000_4000&sec=1471937376&di=bc91d6b0a8668d4df18a52f87c5e1c8d&src=http://img03.tooopen.com/images/20130516/tooopen_06463339.jpg", iv);
}
}
public void showProgress()
{
mDialog = new ProgressDialog(getActivity());
mDialog.show();
}
public void closeProgress()
{
mDialog.dismiss();
}
}
presenter層,就是該項目的紐帶了,與另外兩層進行互動
該TestPresenter的代碼
public class TestPresenter implements TestDelegate.Presenter {
private TestDelegate.View mView;
public TestPresenter(TestDelegate.View view) {
//
mView = view;
//
mView.initPresenter(this);
}
@Override
public void init() {
mView.showProgress();
mIBusiness.search(mView.getParamenters(), new ICallBackListener() {
@Override
public void onSuccess(final CallBackVo mCallBackVo) {
mHandler.post(new Runnable() {
@Override
public void run() {
Gson mGson = new Gson();
JsonElement mJsonElement = mGson.toJsonTree(mCallBackVo.getResult());
Type mType = new TypeToken<List<UserVo.ResultEntity>>() {
}.getType();
List<UserVo.ResultEntity> mRegisterVo = mGson.fromJson(mJsonElement, mType);
mCallBackVo.setResult(mRegisterVo);
mView.closeProgress();
mView.excuteSuccessCallBack(mCallBackVo);
}
});
}
@Override
public void onFaild(final CallBackVo mCallBackVo) {
mHandler.post(new Runnable() {
@Override
public void run() {
mView.closeProgress();
mView.excuteFailedCallBack(mCallBackVo);
Log.e("Tag",mCallBackVo.getReason());
}
});
}
});
}
}
這些大緻就是所有mvp架構包括rxjava+retrofit開發模式架構
對于項目開發的優勢還是很明顯的,高度的解耦,清晰的項目結構,對于開發都非常賞心悅目了,嘎嘎
雖然搭建的時候可能覺得很複雜,但其實上是很清晰的在後續的開發中,非常有利于跟進,
對于中大型項目有非常大的優勢,希望大家可以多多指點,可以在評論中指出。
另外本文有參考其他項目的内容,對于rxjava+retrofit,非常感謝。
之後還會總結一篇mvvm架構方面的内容,
另外介于CSDN的資源模式,資源暫不會上傳,如有需要的直接聯系本人,