³É¶¼ÍøÕ¾½¨Éè Äóö¸É»õ£¬Óë¸÷λС»ï°éÒ»Æð½»Á÷·ÖÏí¹ØÓÚ×ö³ö¼ò½àÃ÷Á˵ÄMVP¼Ü¹¹
MVPµÄ±³¾°
ÖÚËùÖÜÖª MVPÕâÖּܹ¹Ä£Ê½ÒѾ³öÏֺܾÃÁË£¬´óÌåʱ¼äÓ¦¸ÃÊÇ2014Äê°É£¬ÏÖÔÚÍøÉϵĹØÓÚMVPµÄÎÄÕÂÒ²ºÜ¶à£¬¸÷ʽ¸÷ÑùµÄ¹ØÓÚMVPµÄ¼Ü¹¹ÖªÊ¶¶¼Ó¿ÏÖ³öÀ´£¬¿ÉÏë¶øÖªÏÖÔÚÕâÖּܹ¹Óжàô»ð£¬»¹ÓÐĿǰ·çÍ·Õý¾¢µÄMVVM£¬µ±È»ÎÒ²¢²»¾õµÃÎÒÏÖÔÚдMVPÓÐЩÍí£¬ÒòΪÿ¸öÈ˶¼ÓÐÿ¸öÈ˵ļܹ¹£¬Ã¿¸öÈ˶¼¿ÉÒÔ¸ù¾Ý×Ô¼ºµÄÂß¼·â×°³öÀ´×Ô¼ºµÄ¼Ü¹¹Ä£Ê½£¬½ñÌìÎÒ½éÉܵıãÊÇÎÒ×Ô¼ºÍ¨¹ýÏîÄ¿×ܽá³öÀ´µÄMVP
ʲôÊÇMVP
MVP֪ʶµã
MVP - Model-View-Presenter
MVPºÍMVCµÄÇø±ð½ö½öÔÚÓÚPºÍControl,MVCÖÐViewºÍModelÊÇ»¥Í¨µÄ¿ÉÒÔ»¥ÏàͨÐÅ£¬ÔÚAndroidÖÐViewÒ»°ã´ú±í×ÅÎÒÃǵÄxml½øÐнçÃæµÄÃèÊö£¬¶ø¶ÔÓÚÄ£ÐÍModel²¿·ÖÔò´ó¶à¶ÔÓ¦ÓÚ±¾µØµÄÊý¾ÝÎļþ»òÍøÂç»ñÈ¡µÄÊý¾ÝÌ壬ºÜ¶àÇé¿öÏÂÎÒÃǶÔÕâЩÊý¾ÝµÄ´¦ÀíÒ²»áÔÚÕâÒ»²ãÖнøÐУ¬×îºóµÄ¿ØÖÆÆ÷ControllerÔòµ±Ö®ÎÞÀ¢µÄÊÇÓÒActivity³Ðµ£¡£
¶øMVPÖÐviewͨ¹ýpresenter·ÃÎÊmodel£¬´ó´óµÄ¼õСÁËñîºÏÐÔ£¬ÒµÎñÂß¼¶¼½»¸øP´¦Àí£¬Í¨¹ýP·ÃÎÊV²ã¸ü¸ÄUI¡£MVPģʽ¿ÉÒÔ·ÖÀëÏÔʾ²ãÓëÂß¼²ã£¬ËüÃÇÖ®¼äͨ¹ý½Ó¿Ú½øÐÐͨÐÅ£¬½µµÍñîºÏ¡£ÀíÏ뻯µÄMVPģʽ¿ÉÒÔʵÏÖͬһ·ÝÂß¼´úÂë´îÅ䲻ͬµÄÏÔʾ½çÃæ£¬ÒòΪËüÃÇÖ®¼ä²¢²»ÒÀÀµÓë¾ßÌ壬¶øÊÇÒÀÀµÓÚ³éÏó¡£ÕâʹµÃPresenter¿ÉÒÔÔËÓÃÓÚÈκÎʵÏÖÁËViewÂß¼½Ó¿ÚµÄUI£¬Ê¹Ö®¾ßÓиü¹ã·ºµÄÊÊÓÃÐÔ£¬±£Ö¤ÁËÁé»î¶È¡£
ÕâÀï²»¶à½éÉÜMVCÁË£¬ÏàÐÅ´ó¼Ò¶¼ºÜÊìϤ
MVPµÄÓÅȱµã
Óŵ㣺
¡ñ ½µµÍñîºÏ¶È£¬ÊµÏÖÁËM²ãºÍV²ãµÄÍêÈ«·ÖÀ룬¿ÉÒÔÐÞ¸ÄV²ã²»Ó°ÏìM²ã
¡ñ Ä£¿éÖ°Ôð»®·ÖÃ÷ÏÔ£¬²ã´ÎÇåÎú
¡ñ P²ã¿ÉÒÔ¸´Óã¬Ò»¸öP¿ÉÒÔ¶ÔÓ¦¶à¸öV£¬²»ÐèÒªÐÞ¸ÄPµÄÂß¼
¡ñ µ¥Ôª²âÊÔ¸ü¼Ó¼òµ¥·½±ã
¡ñ ´úÂëÁé»î¶È¸ß
ȱµã£º
¡ñ V²ãºÍP²ã½»»¥Æµ·±
¡ñ ´úÂëÁ¿¶à£¬Àà±ä¶àÁË
×ܽá
¡ñ M²ã¸ºÔð´æ´¢¡¢¼ìË÷¡¢²Ù×ÝÊý¾Ý£¬´ú±í×ÅÒ»Àà×é¼þ»òÕßÀ࣬ÕâЩ×é¼þ»òÀà¿ÉÒÔÏòÍⲿÌṩÊý¾Ý£¬Í¬Ê±Ò²ÄÜ´ÓÍⲿ»ñÈ¡Êý¾Ý½«Êý¾Ý´æ´¢ÆðÀ´
¡ñ V²ã¸ºÔð½«Êý¾ÝUI³ÊÏÖ¸øÓû§¡£Ò»°ãµÄÊÓͼUIÖ»°üº¬½çÃæ£¬²¢²»°üº¬½çÃæÂß¼£¬V²ãÊÕP²ã¿ØÖÆ£¬ÔÚAndroidÖÐÒ»°ãÊÇActivity¡¢Fragment¡¢View¡¢ViewGroup¡£¡£¡£
¡ñ P²ã×÷ΪV²ãºÍM²ãµÄÖмäÊàŦ£¬´¦ÀíÓû§½»»¥µÄÒµÎñÂß¼
MVPʵÏÖ
1.»ù±¾ÊµÏÖ
ÎÒÃǶ¼ÖªµÀÒ»°ãMVP¼Ü¹¹Ò»¹²ÐèÒªÒÔÏÂËIJ½£º
¡ñ ¶¨ÒåÒ»¸öinterface½Ó¿ÚXView£¬¶ÔÓ¦µÄActivity£¬FragmentʵÏÖÕâ¸öinterface
¡ñ ±àдMolde£¬ÀïÃæµÄÒµÎñÂß¼Ö÷Òª°üÀ¨ÍøÂçÇëÇó»ñÈ¡Êý¾Ý£¬Êý¾Ý¿â¶ÁÈ¡µÈºÄʱ²Ù×÷£¬Í¨¹ýM²ã»Øµ÷¸øP²ã֪ͨV²ã¸üÐÂUI
¡ñ ±àдPresenter£¬P²ã³ÖÓÐVºÍMµÄÒýÓã¬ÊµÏÖP²ãµÄ»Øµ÷£¬²¢Çһص÷¸øV²ã¸üÐÂ
¡ñ ActivityÖе÷ÓÃPÖ´ÐÐÒµÎñÂß¼£¬¸üÐÂUI
¾ßÌå´úÂë¾Í²»ÌùÁË£¬ÏàÐÅÁ˽â¹ýMVPµÄ¶¼»áд»ù±¾µÄ´úÂë
µ«ÊÇÎÊÌâÒ²¾Í³öÀ´ÁË£¬ÓÉÓÚP²ãÐèÒªºÍV²ã½øÐÐͨÐÅ£¬¸üÐÂUIʱÐèÒª³ÖÓÐV²ãµÄview¶ÔÏó£¬ÄÇôÎÒÃÇÿ¸öPÀïÃæÒ»°ã¶¼Óù¹ÔìÈ¥³õʼ»¯Õâ¸öView£¬Àà¶àÁËÖ®ºó¸Ð¾õºÜ·³£¬¶øView²ãÀïµÄһЩ³£Óõķ½·¨ÎÒÃÇÒ²¿ÉÒÔ·âµ½baseÀïÃæ£¬±ÈÈçloadingµÄÏÔʾÒþ²Ø,¿Õ²¼¾ÖºÍ´íÎó²¼¾ÖµÄÏÔʾ¡
2.Base·â×°
1.BaseView
package com.hankkin.xlibrary.mvp;
import android.view.View;
/**
* Created by hankkin on 2017/3/29.
*/
public interface BaseView {
/**
* ÏÔʾloading¿ò
*/
void showProgress();
/**
* Òþ²Øloading¿ò
*/
void hideProgress();
void toast(CharSequence s);
void toast(int id);
void toastLong(CharSequence s);
void toastLong(int id);
/**
* ÏÔʾ¿ÕÊý¾Ý²¼¾Ö
*/
void showNullLayout();
/**
* Òþ²Ø¿ÕÊý¾Ý²¼¾Ö
*/
void hideNullLayout();
/**
* ÏÔʾÒì³£²¼¾Ö
* @param listener
*/
void showErrorLayout(View.OnClickListener listener);
void hideErrorLayout();
}
2.BasePresenter
package com.hankkin.xlibrary.mvp;
/**
* Created by hankkin on 2017/3/29.
*/
public abstract class BasePresent{
public T view;
public void attach(T view){
this.view = view;
}
public void detach(){
this.view = null;
}
}
ÎÒÃÇÔÚBasePresenterÀïÃæÈ¥³õʼ»¯View¶ÔÏó£¬Í¬Ê±ÌṩÊÍ·ÅView¶ÔÏóÒÔ·ÀÖ¹ÄÚ´æÒç³ö
3.MvpActivity
package com.hankkin.hlibrary.base;
import android.os.Bundle;
import android.support.annotation.Nullable;
import com.lzy.okgo.OkGo;
/**
* Created by hankkin on 2017/3/29.
*/
public abstract class MvpActivity> extends BaseAcitvity{
protected P presenter;
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
presenter = initPresenter();
}
@Override
protected void onResume() {
super.onResume();
presenter.attach((V) this);
}
@Override
protected void onDestroy() {
presenter.detach();
OkGo.getInstance().cancelTag(this);
super.onDestroy();
}
public abstract P initPresenter();
}
ÕâÑùÎÒÃÇÔÚActivityÖгõʼ»¯P£¬²¢ÇÒÁ¬½ÓV£¬ÔÚonDestroy()ÉúÃüÖÜÆÚÖÐÊÍ·ÅPÖÐÒýÓõÄV¡£
Example
ÎÒÃǰ´ÕÕ¹¦ÄÜÄ£¿éÀ´¹¹ÔìÎÒÃǵÄMVP,¿ÉÄÜ´ó¼Ò×¢Òâµ½ÁËûÓÐM²ã°¡£¬Êǵģ¬ÕâÀïÎÒ°ÑM²ãÉáÆúµôÁË£¬°ÑÒµÎñÂß¼¡¢ÍøÂçÇëÇóÖ±½Ó·ÅÔÚÁËP²ã£¬´ó´ó¼õÉÙÁËÀàµÄÊýÁ¿£¬ÕâÑùÎÒÃÇÿ¸ö¹¦ÄÜÄ£¿éÖ»ÐèҪн¨Ò»¸öViewºÍÒ»¸öPresenter¾Í¿ÉÒÔÂú×ãÁË£¬ÌØÊâµÄÐèÇóÔÙͨ¹ýÌØÊâ·½·¨À´´¦Àí£¬ÏÂÃæÎÒÃǾÙÒ»¸ö¼òµ¥µÄÀý×Ó£º
ÍøÂçÇëÇóÎÒÓÃµÄ jeasonlzy ´óÉñµÄOKGo3£¬¸Õ³ö¹øÃ»¼¸Ì죬³¢ÊÔһϣ¬¸öÈËÈÏΪ·â×°µÄ·Ç³£·Ç³£ºÃ£¬¼Ì³ÐÁËRx£¬Retrofit£¬ÏàÐÅÄã»áϲ»¶µÄ¡£
https://github.com/jeasonlzy/okhttp-OkGo
ºÃÁËÏÂÃæ¿´ÎÒÃǵÄÀý×Ó°É£º
ÏîÄ¿½á¹¹
¿´Ò»ÏÂÏîÄ¿½á¹¹
HomeView
ÎÒÓõÄGank.ioÀïÃæµÄÒ»¸ö½Ó¿Ú»ñÈ¡Êý¾Ý£¬Ê×ÏÈÎÒÃǶ¨ÒåÎÒÃǵÄHomeView,ÀïÃæÓÐÁ½¸ö·½·¨»ñÈ¡Êý¾Ý³É¹¦ºÍ»ñȡʧ°Ü
package com.hankkin.mvpdemo.home;
import com.hankkin.hlibrary.BaseView;
/**
* Created by hankkin on 2017/6/19.
*/
public interface HomeView extends BaseView{
void getDataHttp(String data);
void getDataHttpFail(String msg);
}
HomePresenter
È»ºóÎÒÃǶ¨ÒåHomePresenter,ÀïÃæÖ»ÓÐÎÒÃǵÄÍøÂçÇëÇó£¬ÒòΪÎÒÃǵÄBasePresenter³ÖÓÐView¶ÔÏó£¬ËùÒÔÔڻص÷ÖÐÖ±½Óµ÷ÓÃHomeViewµÄÁ½¸ö³É¹¦Ê§°ÜµÄ·½·¨
package com.hankkin.mvpdemo.home;
import com.hankkin.hlibrary.BasePresent;
import com.lzy.okgo.OkGo;
import com.lzy.okgo.callback.StringCallback;
import com.lzy.okgo.model.Response;
/**
* Created by hankkin on 2017/6/19.
*/
public class HomePresenter extends BasePresent {
public void getGankData(){
OkGo.get("http://gank.io/api/data/Android/10/1")
.tag(this)
.execute(new StringCallback() {
@Override
public void onSuccess(Response response) {
view.getDataHttp(response.body());
}
@Override
public void onError(Response response) {
super.onError(response);
view.getDataHttpFail(response.message());
}
});
}
}
Activity
×îºó¿´Ò»ÏÂActivity£¬ÎÒÃǵÄActivity¼Ì³ÐÁËMVPActivity²¢ÊµÏÖÁËHomeView,ͬʱ½«·ºÐͶÔÏóÉèΪÎÒÃǵÄHomeViewºÍHomePresenter£¬ÕâÑùÎÒÃǾͿÉÒÔÖ±½Óµ÷ÓÃP²ãµÄÍøÂçÇëÇó·½·¨£¬Í¬Ê±Ò²Äܻص÷¸üÐÂUI
package com.hankkin.mvpdemo;
import android.os.Bundle;
import android.support.annotation.NonNull;
import android.support.design.widget.BottomNavigationView;
import android.view.MenuItem;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;
import com.hankkin.hlibrary.MvpActivity;
import com.hankkin.mvpdemo.home.HomePresenter;
import com.hankkin.mvpdemo.home.HomeView;
import static com.hankkin.mvpdemo.R.id.btn_get;
public class MainActivity extends MvpActivity implements HomeView{
private TextView mTextMessage;
private Button btnGet;
private BottomNavigationView.OnNavigationItemSelectedListener mOnNavigationItemSelectedListener
= new BottomNavigationView.OnNavigationItemSelectedListener() {
@Override
public boolean onNavigationItemSelected(@NonNull MenuItem item) {
switch (item.getItemId()) {
case R.id.navigation_home:
mTextMessage.setText(R.string.home);
return true;
case R.id.navigation_dashboard:
mTextMessage.setText(R.string.control);
return true;
case R.id.navigation_notifications:
mTextMessage.setText(R.string.notification);
return true;
}
return false;
}
};
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mTextMessage = (TextView) findViewById(R.id.message);
btnGet = (Button) findViewById(btn_get);
BottomNavigationView navigation = (BottomNavigationView) findViewById(R.id.navigation);
navigation.setOnNavigationItemSelectedListener(mOnNavigationItemSelectedListener);
btnGet.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
showProgress();
presenter.getGankData();
}
});
}
@Override
public HomePresenter initPresenter() {
return new HomePresenter();
}
@Override
public void getDataHttp(String data) {
mTextMessage.setText(data);
hideProgress();
}
@Override
public void getDataHttpFail(String msg) {
toast(msg);
}
@Override
public void toast(CharSequence s) {
toast("»ñÈ¡³É¹¦");
}
}
ºÃÁËÊDz»ÊǺܼòµ¥ÄØ£¿Ð¡»ï°éÃÇÈç¹ûÓÐɶºÃµÄ½¨Òé»òÕß¾õµÃ²»Í׵ĵط½Ï£Íû¼°Ê±Ö¸Õý£¬¹²Í¬½»Á÷£¬Ð»Ð»¡£