1、什麼是MVPandroid
MVP:全稱 Model-View-Presenter。網絡
MVP框架由3部分組成:View層負責顯示,Presenter層負責邏輯處理,Model層提供數據。框架
View:負責繪製UI元素、與用戶進行交互(在Android中體現爲Activity,Fragment)ide
Model:負責存儲、檢索、操縱數據oop
Presenter:做爲View與Model交互的中間紐帶,處理與用戶交互的負責邏輯。
佈局
2、建立Model Presenter View三個包post
3、代碼編寫this
1.View層代碼code
view層負責界面操做,如何肯定view層裏面有那些操做呢?
拿我這個UserView舉例.
onLogin表明登陸時候要作的事情,好比顯示一個進度dialog
loginSuccess表明登陸成功後要作的事情,作界面跳轉等操做
loginFail表示登陸失敗後得操做,顯示一個Toast等xml
public interface UserView{ void onLogin(); void loginSuccess(UserBean bean); void loginFail(Exception e,int code); }
2.Presenter層代碼
這層主要負責View層和Model層的鏈接,也有中間人得意思,
View層請求Presenter層,Presenter在請求Model層,Model層處理數據以後經過回調接口傳遞給Presenter層,Presenter在傳遞給View層
在上一張圖
public class UserPresenter implements UserCallback { private UserView mUserView; private UserModel mModel; public UserPresenter(UserView baseView) { mUserView = baseView; mModel= new UserModel(this); } public void userLogin(String name, String pass){ mUserView.onLogin(); mModel.userLogin(name,pass); } @Override public void onSuccess(UserBean bean) { mUserView.loginSuccess(bean); } @Override public void onFail(Exception e, int code) { mUserView.loginFail(e,code); } }
public interface UserCallback { void onSuccess(UserBean bean); void onFail(Exception e ,int code); }
3.model層代碼
model層進行網絡請求等耗時任務處理,model會留有一個回調地址,當數據處理完成以後回調它,在本實例中UserCallback就是一個回調接口,具體實現類在Presenter層,也就是說數據處理完成以後會傳遞給Presenter層
public class UserModel { private UserCallback mUserCallback; private Map<String,String> mUserMaps; private Handler mHandler; /** * * @param userCallback 回調地址,當數據處理完成以後調用這個接口 */ public UserModel(UserCallback userCallback) { mUserCallback = userCallback; mUserMaps=new HashMap<>(); mHandler =new Handler(Looper.getMainLooper()); mUserMaps.put("user1","123456"); mUserMaps.put("user2","12345"); mUserMaps.put("user3","1234"); } public void userLogin(final String name, final String pass){ /** * 模擬延時操做,2秒後調用UserCallback接口,回傳數據 */ mHandler.postDelayed(new Runnable() { @Override public void run() { if (mUserMaps.containsKey(name) && mUserMaps.get(name).equals(pass)){ UserBean bean =new UserBean(name,pass,20); mUserCallback.onSuccess(bean); }else { Exception exception =new Exception("用戶名或帳號錯誤"); mUserCallback.onFail(exception,400); } } },2000); } }
4.MainActivity
public class MainActivity extends AppCompatActivity implements UserView ,View.OnClickListener { private ProgressDialog mProgressDialog; private EditText mUserText; private EditText mUserPass; private Button mLoginBtn; private UserPresenter mUserPresenter; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); mUserPresenter=new UserPresenter(this); initView(); initEvents(); } private void initEvents() { mLoginBtn.setOnClickListener(this); } public void initView () { mUserText = (EditText) findViewById(R.id.userName); mUserPass = (EditText) findViewById(R.id.userPass); mLoginBtn = (Button) findViewById(R.id.loginBtn); } @Override public void onLogin() { mProgressDialog =new ProgressDialog(this); mProgressDialog.show(); } @Override public void loginSuccess(UserBean bean) { Toast.makeText(this, "登陸成功,年齡"+bean.getAge(), Toast.LENGTH_SHORT).show(); } @Override public void loginFail(Exception e, int code) { if (mProgressDialog!=null){ mProgressDialog.dismiss(); Toast.makeText(this, e.getMessage(), Toast.LENGTH_SHORT).show(); } } @Override public void onClick(View v) { switch (v.getId()){ case R.id.loginBtn: if (getUserPass().length()==0 || getUserText().length()==0){ Toast.makeText(this, "請輸入帳號或密碼", Toast.LENGTH_SHORT).show(); return; } mUserPresenter.userLogin(getUserText(),getUserPass()); break; } } private String getUserText(){ return mUserText.getText().toString(); } private String getUserPass(){ return mUserPass.getText().toString(); } }
5.XML佈局
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" android:gravity="center" android:background="#ffffff" tools:context=".MainActivity"> <LinearLayout android:layout_margin="15dp" android:orientation="vertical" android:layout_width="match_parent" android:layout_height="wrap_content"> <EditText android:paddingLeft="6dp" android:paddingRight="6dp" android:textColor="#616161" android:id="@+id/userName" android:inputType="text" android:background="@drawable/shape_editview" android:layout_width="match_parent" android:layout_height="55dp" /> <EditText android:paddingLeft="6dp" android:paddingRight="6dp" android:textColor="#616161" android:layout_marginTop="8dp" android:id="@+id/userPass" android:inputType="textPassword" android:background="@drawable/shape_editview" android:layout_width="match_parent" android:layout_height="55dp" /> <Button android:layout_marginTop="8dp" android:textColor="#ffffff" android:textSize="19sp" android:background="@drawable/shape_login_btn" android:text="登陸" android:id="@+id/loginBtn" android:layout_width="match_parent" android:layout_height="wrap_content" /> </LinearLayout> </LinearLayout>
6.兩個shape
shape_editview.xml
<?xml version="1.0" encoding="utf-8"?> <shape xmlns:android="http://schemas.android.com/apk/res/android"> <corners android:radius="30dp"></corners> <solid android:color="#f7f5f5"></solid> </shape>
shape_login_btn.xml
<?xml version="1.0" encoding="utf-8"?> <selector xmlns:android="http://schemas.android.com/apk/res/android"> <item android:state_pressed="true"> <shape> <corners android:radius="100dp"></corners> <solid android:color="#03a9f4"></solid> </shape> </item> <item android:state_pressed="false"> <shape> <corners android:radius="100dp"></corners> <solid android:color="#0a9ddf"></solid> </shape> </item> </selector>
以上就是MVP模式得簡單實現.必定要多加練習,才能體會掉MVP得優勢