編輯:關於Android編程
隨著移動開發的不斷演進,項目開發設計模式也變的越來越新穎,越來越便捷。而各個團隊都在追求良好的項目架構,不僅能加快工程的進度,也對後續項目的維護和擴展起來很重要的做用。但是,這樣也許就會有人問了,既然架構設計這麼重要,那為什麼不直接設計出來一種萬能的構架,直接用最好的構架不就行了。可是,殊不知項目設計的好壞,並不能完全依賴固化的架構。項目的整個過程,是一個不斷演進的過程,需要不斷的去調整。因為越好的構架設計,邏輯分層是越清楚,代碼耦合度越低,復用性和擴展性更好。然後,這樣的設計,並不是項目一開始就能定型的。
現在根據個人經驗,給大家主說項目架構思路,若有不同意見,歡迎留言交流:
初期項目,設計要遵循這兩點:
一,團隊。
二,項目。
團隊:根據團隊的成員人數和能力去劃分。
項目:根據功能的多少和功能的復雜度劃分。
小的項目團隊,采取最簡單的模式。統一協作能加快開發,溝通快捷。
大的項目團隊,則需要有一個好的功能模塊劃分,設計項目中的耦合設計。兩三人為一小組進行模塊開發。充分發揮小團隊高效優勢,完成項目。
任何項目,最重要的問題就是delay。若一出問題就是各種不可控制。所以,一個好的項目經理,不僅僅是會設計出好的項目架構,更重要的是根據團隊的能力,能按時完全產品上線,保證產品的穩定性。這才算是一個合格的項目經理。項目經理要真正的在團隊中說NO。面對老板實時要修改需求說NO,面對團隊有困難不敢面對說NO。控制好產品的正確走向,才是做好事情的根本。
好了,閒說扯了一大堆,就不多說了。因為有人問起,所以就隨手寫點了。但說的再多還是實戰的經驗才是最重要的。不同的團隊需要有不一樣的處理方式,這個是沒有模式可言。只有你懂得把控,才是掌握全局。給大家的經驗之談,說的不對歡迎交流!!!
-------------------------------------------------------------------------------------------------------------------------
開始正題:
mvc,相應不用多說,寫程序的同學都懂,也應該都會用。現在就來說說mvp的設計架構。下面的這只是一個很簡單的例子,就是為了讓大家更簡單清晰的看清流程。方便讓那些想學習的同學一看就懂。
先看一個小圖助於理解:
記住,團隊項目開發,功能分離。降低耦合。都是要注重接口編程。對外統一接口,對內擴展。外部減少代碼關聯,內部功能清楚。這才是好的要求習慣。
好了,繼續;
項目代碼結構圖(是不是特別的簡單):
小項目就是點擊按鈕,從底層拿到數據,返回!!!特別特別的so easy!!
LoginActivity:登錄頁面。只需要關注與它關聯的LoginPresenter即可。不需要關注底層數據。(當然,若是真實的項目開發,接口是需要統一接口協議和數據模式的!在此就不過多復雜了!)
package net.hd.mvpdemo.activity; import android.app.Activity; import android.os.Bundle; import android.view.View; import android.widget.EditText; import android.widget.TextView; import net.hd.mvpdemo.R; import net.hd.mvpdemo.presenter.ICallback; import net.hd.mvpdemo.presenter.LoginPresenter; import butterknife.BindView; import butterknife.ButterKnife; import butterknife.OnClick; /** * UI邏輯:關注UI操作和結果。操作關聯的LoginPresenter及回調接口。 */ public class LoginActivity extends Activity implements ICallback { //順便讓大家學習下butterknife了 @BindView(R.id.name) EditText mNameEt; @BindView(R.id.password) TextView mPsdTv; @BindView(R.id.login_progress) View mProgressView; private LoginPresenter mPrsenter; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_login); ButterKnife.bind(this); mPrsenter = new LoginPresenter(this); } @OnClick(R.id.email_sign_in_button) void onSubmit() { String obj = mNameEt.getText().toString(); mPrsenter.operateView(obj); } /** * 向Presenter注冊callback,回調接口 * * @param obj */ @Override public void callback(String obj) { mPsdTv.setText("密碼:" + obj); } }
IMvpView 接口,作View數據分發。(真實的項目開發中有用。小項目用著感覺特別扭!但功能多的時候,不同的UI模式可能需要聯系,而未免直接相互調用,需要定義統一接口方式,功能隔離的好用處啊!!當然,還有個BaseView,進行重復代碼封裝,但此小例子,實在寫著多多余了!)
package net.hd.mvpdemo.view; import android.app.Fragment; import net.hd.mvpdemo.presenter.IMvpPresenter; import java.util.Objects; /** * Created by dan on 2016/9/2. *
* 分發接口 */ public interface IMvpView { void operateView(Objects obj); }
package net.hd.mvpdemo.presenter; import net.hd.mvpdemo.view.IMvpView; import java.util.Objects; /** * Created by dan on 2016/9/2. * presenter接口。對View和Model都應該是展示其接口就成 */ public interface IMvpPresenter { void operateModel(String obj, ICallback back); }
package net.hd.mvpdemo.presenter; import java.util.Objects; /** * 可以寫一個統一的回調接口。 * 作用:用於View/presenter。model/presenter之間的回調 * 這裡只是簡單實現,理解其思路即可,具體接口定義,則根據實際的業務需求 * Created by dan on 2016/9/2. */ public interface ICallback { void callback(String obj); }
package net.hd.mvpdemo.presenter; import net.hd.mvpdemo.model.IMvpModel; import net.hd.mvpdemo.model.LoginModel; /** * Created by dan on 2016/9/2. *
* presenter做為連接view與model。進行數據隔離 * 不同的presenter做不同的數據分發處理 */ public class LoginPresenter implements IMvpPresenter, IMvpModel, ICallback { private IMvpModel model; private ICallback viewCallback; /** * 通過presenter構造方法,創建Model對象,隔離View與Model的聯系 */ public LoginPresenter(ICallback cb) { model = new LoginModel(); viewCallback = cb; } public void operateView(String obj){ operateModel(obj, this); } @Override public void operateModel(String obj, ICallback back) { handModel(obj, back); } /** * 通過callback,完成操作回調數據,通過view更新 */ @Override public void handModel(String obj, ICallback call) { model.handModel(obj, call); } /** * model數據處理完,通過viewcallback回調給上層view * * @param obj */ @Override public void callback(String obj) { viewCallback.callback(obj); } }
package net.hd.mvpdemo.model; import net.hd.mvpdemo.presenter.ICallback; import java.util.Objects; /** * model層統一實現接口 * Created by dan on 2016/9/2. */ public interface IMvpModel { void handModel(String obj, ICallback back); }
package net.hd.mvpdemo.model; import net.hd.mvpdemo.presenter.ICallback; import java.util.Objects; /** * 基礎model,相同的邏輯統一處理 * 不同的邏輯,再由子類實現 * Created by dan on 2016/9/2. */ public class BaseModel implements IMvpModel { @Override public void handModel(String obj,ICallback back) { } }
package net.hd.mvpdemo.model; import net.hd.mvpdemo.presenter.ICallback; import java.util.Objects; import java.util.Random; /** * Created by dan on 2016/9/2. */ public class LoginModel extends BaseModel { /** * 模擬登錄 */ private void loginAsync(final String obj, final ICallback onCallback) { new Thread(new Runnable() { @Override public void run() { try { Thread.sleep(3000); } catch (InterruptedException e) { e.printStackTrace(); } int i = new Random().nextInt(1000); onCallback.callback(obj + i); } }).run(); } @Override public void handModel(String obj, ICallback back) { loginAsync(obj,back); } }
不知道大家有沒有看懂了???
代碼還是有空多寫寫,思路就會清楚了。這只是一個很簡單的例子。
有空的時候,再寫個mvvm的例子了。
有問題多交流!!!做技術就是先多想,然後再多寫,最後就多問了!搞清楚明白了,這才是自己的知識。不然,終究只是個代碼搬運工了。
祝大家都能成為大牛。只要你能持之以恆!!!
馬上要到五一了,提前祝賀大家五一快樂。今天的主角是路勁,這個詞給我的第一印象就是那種彎彎的小路,屆時讓我想起了小時候的曲徑通幽處,反正我是忘記了下一句是什麼。言歸正傳,A
騰訊手機管家,初始界面有個小飛機動啊動啊,還挺好玩的,而且顯示新特征為豎向展示,不知道這種東西該如何實現呢?給自己留下比較深的印象,然後樓主就是探索這種是如何實現的。
Android AIDL, Android進程機制通信機制,這裡就整理下AIDL 的知識,幫助大家學習理解此部分知識!什麼是 AIDLAIDL 全稱 Andr
Service有什麼作用?許多人不明白service是用來干嘛的,其實Service作為Android四大組件之一,可以理解為一個運行在後台的Activity,它適用於處