編輯:關於Android編程
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(@Field("key") String key); }
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; } }
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() { @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); } }
public interface TestDelegate { interface View extends AxBaseDelegate.AxIView然後是fragment中的,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(); } }
@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) { ListmUserVo = (List ) 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=/uploadfile/2016/0831/20160831091311760.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=/uploadfile/2016/0831/20160831091311760.jpg", iv); } } public void showProgress() { mDialog = new ProgressDialog(getActivity()); mDialog.show(); } public void closeProgress() { mDialog.dismiss(); } }
該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>() { }.getType(); List
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()); } }); } }); } }
對於項目開發的優勢還是很明顯的,高度的解耦,清晰的項目結構,對於開發都非常賞心悅目了,嘎嘎
雖然搭建的時候可能覺得很復雜,但其實上是很清晰的在後續的開發中,非常有利於跟進,
對於中大型項目有非常大的優勢,希望大家可以多多指點,可以在評論中指出。
另外本文有參考其他項目的內容,對於rxjava+retrofit,非常感謝。
之後還會總結一篇mvvm框架方面的內容,
另外介於CSDN的資源模式,資源暫不會上傳,如有需要的直接聯系本人,
一:簡介 systrace 是 Android4.1 引入的一套用於做性能分析的工具。 基於 Linux 內核的 ftrace 機制(用於跟蹤 Linux 內核的函數調用
SQLite是Android平台軟件開發中會經常用到的數據庫產品,作為一款輕型數據庫,SQLite的設計目標就是是嵌入式的,而且目前已經在很多嵌入式產品中使用了它,它占用
概述:MediaRecorder的狀態圖:代碼:開始錄制音頻:mRecorder = new MediaRecorder(); //Sets
本文代碼以MTK平台Android 4.4為分析對象,與Google原生AOSP有些許差異,請讀者知悉。 Android系統通話記錄存儲在聯系人數據庫contacts