編輯:Android開發教程
相信大家對 MVC 都是比較熟悉了:M-Model-模型、V-View-視圖、C-Controller-控制器,MVP作為MVC的演化版本,也是作為用戶界面(用戶層)的實現模式,那麼類似的MVP所對應的意義:M-Model-模型、V-View-視圖、P-Presenter-表示器。
MVC詳見博客: Android之MVC模式的使用
Model 是用戶界面需要顯示數據的抽象,也可以理解為從業務數據(結果)那裡到用戶界面的抽象。
視圖這一層體現的很輕薄,負責顯示數據、提供友好界面跟用戶交互就行。MVP下Activity和Fragment體現在了這一層,Activity一般也就做加載UI視圖、設置監聽再交由Presenter處理的一些工作,所以也就需要持有相應Presenter的引用。
Presenter這一層處理著程序各種邏輯的分發,收到View層UI上的反饋命令、定時命令、系統命令等指令後分發處理邏輯交由業務層做具體的業務操作,然後將得到的 Model 給 View 顯示。
MVC和MVP的區別
在 MVC 中:
在 MVP 中:
模仿登錄案例:(demo中包含登錄和網絡數據請求)
model
public class ModelSignIn implements ILoginSignIn { @Override public void onSignIn(String name, String pwd, IOnSetListenter listenter) { if (name.isEmpty()) { if (listenter!=null) { listenter.onError("輸入用戶名為空"); return; } } if (pwd.isEmpty()) { if (listenter!=null) { listenter.onError("輸入密碼為空"); return; } } if(name.equals("dickyqie") && pwd.equals("123456")) { if (listenter!=null) { listenter.onError("登錄成功"); return; } }else{ if (listenter!=null) { listenter.onError("登錄失敗"); return; } } } }
presenter
public class Presenter extends BasePresenter<IView> { ILoginSignIn iLoginSignIn=new ModelSignIn(); public void setSignIn(String name,String pwd) { iLoginSignIn.onSignIn(name, pwd, new ILoginSignIn.IOnSetListenter() { IView view=getView(); @Override public void onError(String error) { if(view!=null){ view.showToast(error); } } @Override public void onSccess(String repsonce) { if(view!=null){ view.showToast(repsonce); } } }); } }
activity
public class MainActivity extends BaseActivity<IView,Presenter> implements IView,View.OnClickListener{ EditText username; EditText password; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); initView(); } private void initView() { username=(EditText)findViewById(R.id.username); password=(EditText)findViewById(R.id.password); findViewById(R.id.login).setOnClickListener(this); } @Override public Presenter createPersenter() { return new Presenter(); } @Override public void onClick(View v) { String name=username.getText().toString(); String pwd=password.getText().toString(); p.setSignIn(name,pwd); } @Override public void showToast(String msg) { Toast.makeText(getApplicationContext(),msg,Toast.LENGTH_LONG).show(); } }
網絡請求
public class MainActivity extends BaseActivity<IView,Presenter> implements IView,View.OnClickListener { private TextView textView; private ProgessDialog dialog; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); initView(); } private void initView(){ textView=(TextView) findViewById(R.id.text); findViewById(R.id.btn).setOnClickListener(this); } @Override public void onLoadContributorStart() { showProgress(); } @Override public void onLoadContribtorComplete(String topContributor) { //得到主線程的數據 Message msg=new Message(); msg.what=1; msg.obj=topContributor; handler.sendMessage(msg); } Handler handler=new Handler(){ @Override public void handleMessage(Message msg) { super.handleMessage(msg); dismissProgress(); textView.setText(msg.obj.toString()); } }; @Override public void onClick(View v) { p.setGet(); } @Override public Presenter createPresenter() { return new Presenter(); } @Override public void onNetWork() { Toast.makeText(getApplicationContext(),"網絡未連接",Toast.LENGTH_LONG).show(); } @Override public void onError() { Toast.makeText(getApplicationContext(),"數據加載失敗",Toast.LENGTH_LONG).show(); textView.setText(""); } /*** * 啟動 */ public void showProgress() { if(dialog==null) { dialog=new ProgessDialog(MainActivity.this); } dialog.showMessage("正在加載"); } /*** * 關閉 */ public void dismissProgress() { if(dialog==null) { dialog=new ProgessDialog(this); } dialog.dismiss(); } }
不要忘記在AndroidManifest.xml加權限哦!
<uses-permission android:name="android.permission.INTERNET"/>
在上一篇文章中,我和大家一起實現了類似於Android系統聯系人的分組導航和擠壓動畫功能,不過既然 文章名叫做《Android系統聯系人全特效實現》,那麼沒有快速滾動功能
Android應用中的Activity指具有屏幕顯示支持用戶交互的基本模塊,類似於Java ME中的MIDlet, Windows 應用中的Form。 比如可以是撥號,發
除了“對話框”進度條,也可以創建一個顯示“操作進度”的對話框,例如顯示正在下載的狀態。1. 創建一個工程:Dialog。2
大家好,今天給大家帶來一個仿360手機衛士懸浮窗效果的教程,在開始之前請允許我說幾句不相干的廢 話。不知不覺我發現自己接觸Android已有近三個年頭了,期間各種的成長少
Preferences之間可以定義依賴關系,在第一個例子中已有說明。對應