編輯:關於Android編程
對於mvp模式,大家都知道是由mvc演變而來的,對於MVC大家都知道
M Model(用於存放實體模型與業務邏輯) V View(存放布局和資源文件) C Control(存放Activity)對於mvc中的view在android中的功能就比較弱化了並且在Control中的activity中我們在實際開發中經常都是上千行代碼,經常都是將對一些點擊時間的處理和一些邏輯都放在activity中,這樣就造成了activity很臃腫,並且這樣對於activity在mvc中處於View與Control之間 這個尴尬的位置
對於mvp模式的出現則挽回了activity在mvc中的尴尬局面,mvp主要為
M Model(存放數據模型與業務邏輯) V View(存放activity 已經一些自定義的View) P Presenter(主要負責View與Model的交互)我們可以看到mvc由mvp的轉化主要將Control換成了Presenter,由Presenter來處理activity中的邏輯和與Model層的交互
其實對於mvc轉換到mvp我們可以用下面的兩張圖來解釋一下
mvc模式
mvp模式
我們可以看出上面的兩張圖,由activity直接向Model層通信,轉化到 View層通過Presenter層向 Model的數據類型通信,這樣可以明顯的看出很大程度降低了程序的耦合度,廢話也不多說了,下面我們用一個掃描音樂的例子來讓大家更直觀的理解mvp
下面我用一個簡單的提交信息的例子來說明下mvp在這個例子是怎麼用的,下面是示例圖
下面是項目的整個結構
我們可以看出我們在MainActivity中的一些邏輯性的代碼全都通過MainActiityPresenterCompl來實現,由他直接向Model層通信
下面是代碼
信息模型
/** * Created by blue on 2016/10/15. */ public class UserInfo { public String getName() { return name; } public void setName(String name) { this.name = name; } public String getGender() { return gender; } public void setGender(String gender) { this.gender = gender; } public String getAge() { return age; } public void setAge(String age) { this.age = age; } public String getHobby() { return hobby; } public void setHobby(String hobby) { this.hobby = hobby; } private String age; private String name; private String gender; private String hobby; }
presenter的接口
package com.mvpdemo.blue.mvpdemo.presenter.ipresenter; import android.content.Context; import android.widget.EditText; import android.widget.ProgressBar; import java.util.List; /** * Created by blue on 2016/10/15. */ public interface IMainActivityPresenter { void submitData(Context context , ListeditList, ProgressBar progressBar); void initData(List editList); }
mainActivity的presenter具體實現類
import android.content.Context; import android.os.Handler; import android.os.Looper; import android.view.View; import android.widget.EditText; import android.widget.ProgressBar; import android.widget.Toast; import com.mvpdemo.blue.mvpdemo.model.info.UserInfo; import com.mvpdemo.blue.mvpdemo.presenter.ipresenter.IMainActivityPresenter; import java.util.List; /** * Created by blue on 2016/10/15. */ public class MainActivityPresenterCompl implements IMainActivityPresenter { @Override public void submitData(final Context context, final ListeditList, final ProgressBar progressBar) { progressBar.setVisibility(View.VISIBLE); final Handler mainHandler = new Handler(Looper.getMainLooper()); new Thread() { @Override public void run() { /*模擬提交信息*/ try { Thread.sleep(2000); } catch (InterruptedException e) { e.printStackTrace(); } UserInfo info = new UserInfo(); info.setAge(editList.get(0).getText().toString()); info.setGender(editList.get(1).getText().toString()); info.setName(editList.get(2).getText().toString()); info.setHobby(editList.get(3).getText().toString()); mainHandler.post(new Runnable() { @Override public void run() { progressBar.setVisibility(View.INVISIBLE); Toast.makeText(context,"提交數據完成",Toast.LENGTH_SHORT).show(); initData(editList); } }); } }.start(); } @Override public void initData(List editList) { for (EditText editText:editList) editText.setText(""); } }
MainAcitivty文件與接口
package com.mvpdemo.blue.mvpdemo.view.activity; import android.support.v7.app.AppCompatActivity; import android.os.Bundle; import android.view.View; import android.widget.Button; import android.widget.EditText; import android.widget.ProgressBar; import com.mvpdemo.blue.mvpdemo.R; import com.mvpdemo.blue.mvpdemo.presenter.compl.MainActivityPresenterCompl; import com.mvpdemo.blue.mvpdemo.presenter.ipresenter.IMainActivityPresenter; import com.mvpdemo.blue.mvpdemo.view.interfaceview.IMainActivityView; import java.util.ArrayList; import java.util.List; public class MainActivity extends AppCompatActivity implements IMainActivityView, View.OnClickListener { private IMainActivityPresenter mainActivityPresenter ; private ListeditList ; private ProgressBar progressBar ; private Button btn_submit; private Button btn_clean; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); init(); initView(); } @Override public void init() { mainActivityPresenter = new MainActivityPresenterCompl(); editList = new ArrayList<>(); } @Override public void initView() { editList.add((EditText) findViewById(R.id.age)); editList.add((EditText) findViewById(R.id.gender)); editList.add((EditText) findViewById(R.id.name)); editList.add((EditText) findViewById(R.id.hobby)); progressBar = (ProgressBar) findViewById(R.id.submit_pro); btn_clean = (Button) findViewById(R.id.clean); btn_submit = (Button) findViewById(R.id.submit); btn_submit.setOnClickListener(this); btn_clean.setOnClickListener(this); progressBar.setBackgroundColor(getResources().getColor(R.color.colorPrimary)); } @Override public void submitData() { mainActivityPresenter.submitData(this,editList,progressBar); } @Override public void initData() { mainActivityPresenter.initData(editList); } @Override public void onClick(View view) { switch (view.getId()) { case R.id.submit: submitData(); break; case R.id.clean: initData(); break; } } }
package com.mvpdemo.blue.mvpdemo.view.interfaceview; /** * Created by blue on 2016/10/15. */ public interface IMainActivityView { void initView(); void submitData(); void initData(); void init(); }
下面是布局文件
這就是mvp模式這也只是一個最簡單的例子,也只能用來理解mvp,更高深的運用,還需要繼續學習,就到這裡了,需要源碼的朋友,請在下面留言
1.ServicesService 是一個可以在後台執行長時間運行操作而不使用用戶界面的應用組件。服務可由其他應用組件啟動,而且即使用戶切換到其他應用,服務仍將在後台繼續
最近接了個項目其中有需要要實現此功能:seekbar需要顯示最左和最右值,進度要跟隨進度塊移動。下面通過此圖給大家展示下效果,可能比文字描述要更清晰。其實實現起來很簡單,
1. 什麼是dumpsysThe dumpsys tool runs on the device and provides information about the s
Android的PopupWindow是個很有用的widget,利用它可以實現懸浮窗體的效果,比如實現一個懸浮的菜單,最常見的應用就是在視頻播放界面裡,做一個工具欄,用來