µ¼ÓMVP¿ª·¢Ä£Ê½¿ÉÒÔ°ïÖúÏîÄ¿½á¹¹½âñµ«ÆäÅÓ´óµÄ·½·¨ÊýÔö¼Ó£¬½ÏΪ±¿ÖØÉè¼Æ¶ÔÓÚÊÖQÏîÄ¿²¢²»ºÜÊʺϡ£²Î¿¼Ö®Ç°Web¿ª·¢¾Ñ飬Ìá³öÒÔÒ³Ãæ½á¹¹»¯µÄ½âñʽ×éÖ¯´úÂë¡£ÏÂÃæ½²½²LegoÔÚAndroidÉÏÒ»´ÎСС³¢ÊÔ
Ò»£¬MVP¼ò½é

MVCÌ«¹ý³£¼ûÕâÀï²»†ªà¡£Êµ¼ÊÓ¦ÓÃMVCµ±ÖУ¬ActivityÕ¼¾Ý´ò²¿·ÖµÄ¹¤×÷£¬ViewºÍControllerµÄÉí·Ý·Ö²»Çå¡£¶øMVPÔòÊÇÒ»ÖÖÉè¼ÆÄ£Ê½×¨ÃÅÓÅ»¯Activity
/ Fragment¡£
ÏÈÀ´¿´¿´MVPģʽµÄºËÐÄ˼Ï룺View²»Ö±½ÓÓëModel½»»¥
MVP °Ñ Activity ÖÐµÄ UI Âß¼³éÏó³É View ½Ó¿Ú£¬°ÑÒµÎñÂß¼³éÏó³É Presenter
½Ó¿Ú£¬Model À໹ÊÇÔÀ´µÄ Model
ÔÚMVPÉè¼ÆÄ£Ê½ÖУ¬
View£ºÓÉActivity³äµ±£¬²¢ÇÒÏìÓ¦ÉúÃüÖÜÆÚ
Model£º»¹ÊÇÔÀ´µÄÊý¾Ý²ã£¬ÍøÂ磬»º´æ£¬½âÎöµÈ¡£
Presenter£º×÷ΪViewºÍModelµÄÖмäŦ´ø£¬View²»ÄÜÖ±½Ó¶ÔModel½øÐвÙ×÷£¬±ØÐë¾¹ýPresenter
View interface£ºÐèÒªViewʵÏֵĽӿڣ¬Viewͨ¹ýView interfaceÓëPresenter½øÐн»»¥£¬½µµÍñîºÏ
¶þ£¬ÈÕ¼£MVPʵսӦÓÃ
¡¾Mode²ã¡¿ÎÒÃÇÖ±½ÓºöÂÔ
¡¾View Interface¡¿Ê×Ò³µÄView½Ó¿Ú£¬³éÀë³öviewºÍpresnter½»»¥µÄ½Ó¿Ú¡£ÓÉActivity¼Ì³ÐʵÏÖ£¨Now.java£¬QQStoryMainActivity.java£©
public interface
IMyStoryListView {
public void setData(MyStorys myStoryList, RecentStory
recentStoryList);
public void setSegmentData(String key, Object
data,boolean needRefreshUi);
/**
* ¸üÐÂÊý¾ÝºóˢнçÃæ×ߵĻص÷
* @param success
* @param isManualPullRefresh
*/
public void pullRefreshCompleted(boolean success,boolean
isReqCompleted);
public void launchNewVideoTakeActivity(boolean
autoStart, boolean checkSo, int entranceType,String
extra);
public void setPlayVideoBtnDisplay(boolean display);
public void showStartDownload();
public void showDownloadCompleted(boolean success);
public void storyPreLoadCompleted(String category,
String uin);
public void LoadMoreCompleted(boolean repositoryUpdated,
boolean isEnd);
public void showEmptyView(boolean display);
public void requestDataCompleted();
public void openMyStoryListView(boolean open);
} |
¡¾View¡¿ÎÒÃǵÄActivityʵÏÖÁËView½Ó¿Ú£¬²¢ÇÒʵÏÖÉúÃüÖÜÆÚ
public class
QQStoryMainAcitivty extends QQStoryBaseActivity
implements IMyStoryListView {
protected StoryHomePushYellowBarHandler mStoryHomePushYellowBarHandler
= new StoryHomePushYellowBarHandler();
protected MystoryListView mainListView;
protected IMyStroyPresenter myStoryListPresenter;
@Override
protected boolean doOnCreate(Bundle savedInstanceState)
{
super.doOnCreate(savedInstanceState);
mainListView = (MystoryListView) super.findViewById(R.id.qqstory_story_main_listview);
//Presenter
myStoryListPresenter = new StoryListPresenter(this);
myStoryListPresenter.setIView(this);
return true;
}
@Override
public void onStartAutoRequestFromNet() {
startTitleProgress();
mainListView.pullToRefresh();
mStoryHomePushYellowBarHandler.clearYellowBar();
myStoryListPresenter.requestAllDataFromNet();
}
private void startTitleProgress(){
// do more
}
} |
¾Ù¸öÀý×Ó£¬Óû§ÏÂÀË¢ÐÂһϡ£´¥·¢µ½ActivityµÄonStartAutoRequestFromeNet¡£ViewÂß¼ÔÚActivity¡£
ÒµÎñÂß¼ÔòÓÉPresnterµÄrequestAllDataFromNetȥʵÏÖ¡£
¡¾Presenter¡¿¾ßÌåµÄView->Model,Mode->ViewÓÉÕâÀïʵÏÖ£¬ÆäÖÐViewÊÇÓÐView½Ó¿Ú³éÏ󣬽øÒ»²½¹æ·¶»¯ViewµÄÂß¼¡£
±ØÒªÊÇ¿ÉÒÔ³é³öPresenter½Ó¿Ú£¨ÆäʵÈÕ¼£ÕâÀïûÓбØÒª£©
public class
StoryListPresnter implements IMyStroyPresenter{
protected IMyStoryListView mIView;
protected FeedItem mFeedItem;
protected ParallelStepExecutor mRequestNetDataExecutor;
@Override
public void onCreate(boolean needUpdateFromNet)
{
// ÉúÃüÖÜÆÚµÄÂß¼´¦Àí
mFeedItem = new FeedItem();
}
@Override
public void setIView(IMyStoryListView IView)
{
// ÉèÖÃView½Ó¿Ú(ĿǰʵÏÖµÄÊÇActivity£¬µ«ÆäʵÓÉÆäËûFragment£¬ViewʵÏÖ¶¼ÊÇ¿ÉÒԵģ¬Õâ¾ÍÊÇMVPµÄºÃ´¦Ö®Ò»£¬½âñî)
mIView = IView;
}
public boolean requestAllDataFromNet() {
mRequestNetDataExecutor.addStep(new GetUserSelfInfoStep(null))
.addStep(new ReportWatchVideoListStep(StoryListPresenter.this))
.addStep(new GetUserGuideInfoStep(StoryListPresenter.this))
.onCompleted(new SimpleStepExector.CompletedHandler()
{
@Override
public void done(FeedItem item) {
// α´úÂë
mFeedItem = item; // ´¦ÀíModel²ã
mIView.openMyStoryListView(mFeedItem); // ¸ù¾ÝView½Ó¿Úµ÷ÓÃView¸üÐÂ
}
}).run();
}
} |
MVPµÄÓÅȱµã£º
Óŵ㣺
½âñ¾ø¶ÔµÄ¡£²»È»³éÕâô¶à½Ó¿Ú¸ÉÂï
Ä£¿éÖ°ÔðÃ÷È·£¬²ã´ÎÇåÎú
Presenter¿É¸´Óã¨ÔÚÈÕ¼£µÄÐèÇóÖУ¬Ê×Ò³ºÍ4Tab¹«ÓÃÒ»¸öPresnter£©
·½±ãµ¥Ôª²âÊÔ
±ÜÃâActivityÄÚ´æÐ¹Â¶£¬ AcitvityÒ»ÉíÇáËÉ
MVPµÄȱµãÒ²ÊǷdz£Ã÷È·µÄ£º
·Ç³£µÄ±¿ÖØ¡£Ò»¸öView¾Í¶ÔÓ¦Ò»¸öPresenter£¬ÇáÒµÎñÒ»¸öActivityÄܽâ¾öµÄ¾Í²»Òª½â¾ö
PresnterÒÀÈ»Âß¼·±ÖØ¡£AcitivtyÇáËÉÁË£¬ÒµÎñÂß¼ÅÓ´óµÄʱºòPresnterÒÀÈ»ÊÇ´óÅÖ×Ó¡£
´úÂ븴ÔÓ¶È£¬Ñ§Ï°³É±¾¡£ÕâÍæÒâ²»ºÃÀí½â£¬ÐèҪʵսÖÐÀí½â¡£
ÔÚÊÖQÏîÄ¿ÀMVP»á¼¤ÔöºÜ¶à·½·¨Êý¡£

Èý£¬LegoÒ³Ãæ½á¹¹»¯
Ç°ÃæÆÌµæÕâô¶à£¬ÖÕÓÚµ½ÎÒÒª´µË®µÄʱºòÁË¡£MVC£¬MVP£¬»¹ÓÐMVVMµÈMVXϵÁеÄÉè¼ÆÄ£Ê½£¬¶¼ÊÇÒ»ÖÖ´ó¶øÈ«µÄͳһ¹ÜÀí¡£ÔÚÏîÄ¿½á¹¹ÖÐ×îΪ¹Ø¼üÆäʵÊÇ£º·ÖÄ£¿é£¡

¿´¿´Ä³±¦µÄÊ×Ò³£¬¶¥²¿ËÑË÷À¸£¬banner£¬µ¼º½·ÖÀ࣬ÇÀ¹º£¬Ìؼۣ¬µ×²¿Tab¡£ÕâÊÇÒ»¸öActivityµÄ»°£¬ÄãÔÙÔõôMVP£¬Ò²ÊÇÐèÒª»®·ÖÄ£¿é£¬È»ºó·Ö¶øÖÎÖ®¡£
Ò»¸öÔÙ´óµÄϵͳ£¬¶¼¿ÉÒÔ»®·ÖÒ»¸ö¸öСµÄÄ£¿é£¬·Ö¶øÖÎÖ®
Ò³Ãæ½á¹¹»¯£¬²¢²»ÊÇÐÂÍæÒ⣬Êǵ±Ê±×öwebµÄÒ»Ì×´úÂë·ç¸ñ¡£ÏÂͼÊǵ±Ê±×öWeb×ܽá×é¼þ»¯µÄÒ»ÕÅͼ¡£ÏÖÔÚ¿´À´£¬Ò²¾Í²¢Ã»Óйýʱ

Ò³Ãæ±»»®·ÖÎÊÒ»¸ö¸öÇøÓòµÄÄ£¿é£¬ÓÐ×ÔÉíµÄÂß¼ºÍ¹æ»®¡£ÓÐÈË˵£¬Õâ²»¾ÍÊÇÒ»¸ö¸ö×é¼þÂȻºó¡°Ò³Ãæ½á¹¹»¯¡±²¢²»ÊÇÖ¸×é¼þ¡£
ÀýÈçÉÏͼµÄtabContainer£¬imgsContainer£¬listContainer£¬Ã¿Ò»¸öÄ£¿é¶¼ÓÐ×Ô¼ºµÄäÖȾģ°å£¨xml£©£¬ÇëÇóµÄÊý¾ÝµÄCGI£¨Êý¾ÝÔ´£©£¬×ÔÉíµÄʼþ°ó¶¨£¨listener£©
£¬×´Ì¬»ú£¨ÉúÃüÖÜÆÚ£©£¬²¢²»Ö»ÊÇÒ»¸ö×é¼þ£¬¶øÊÇÒ»¸ö¸öÓÐ×Ô¼ºÉúÃüÁ¦£¬ÄÜ×Ô¼º¹ÜÀíµÄÐ¡Ò³Ãæ¡£
¸ù¾ÝÒ³Ãæ½á¹¹£¬»®·Ö³öÒ»¸ö¸ö¶ÀÁ¢Î¬»¤Ä£¿é£¬Õâ¾ÍÊÇÒ³Ãæ½á¹¹»¯¡£
Ò³Ãæ½á¹¹»¯£¨Lego£©Óë×é¼þ»¯µÄÇø±ð
×é¼þ´¦ÓÚͨÓÃÐÔ£¬ÊDz»´øÒµÎñÂß¼µÄ¡£¶øÒ³Ãæ½á¹¹»¯ÊÇ´øÒµÎñÂß¼¡£
Ò³Ãæ½á¹¹»¯Ä¿µÄÊÇΪÁË´úÂëά»¤ÐÔ£¬ÏîÄ¿¹ÜÀí£¬ÓÅ»¯¡£×é¼þ¸´ÓÿÉÒÔÓУ¬µ«²»ÊDZØÒª
×é¼þÓëLego²»³åÍ»¡£×é¼þ +Êý¾Ý£¬ÒµÎñÂß¼ = Lego
ÏÂÃæ¾ÍÒÔÎÊ´ðµÄÐÎʽ£¬ÓÃÈÕ¼£ÆÀÂÛÔÞÏîĿʵս£¬À´½²½âLegoºÃ´¦
ËÄ£¬·ÖÎöÒ³Ãæ½á¹¹»¯ÌØÐÔ
Lego×Ô¼ºÀÈ¡×Ô¼ºµÄÊý¾Ý£¬Èç¹ûÒ»¸öÒ³Ãæ5,6¸öÄ£¿é£¬¾ÍÀ5,6·ÖPBÐÒ飬̸ºÎÐÔÄÜ£¿
ÕâÀï´ø³öLegoÁ½¸öÌØÐÔ£º
ÿ¸öLegoÊÇÓÐ×Ô¼ºµÄÊý¾Ý£¬²¢²»ÊÇÒ»¶¨Òª×Ô¼ºÀÈ¡£¬Êý¾Ý¿ÉÒÔÓÐÆäËûLego´«µÝ
LegoÓи¸×Ó¹ØÏµ¡£Ò»¸öÒ³Ãæ/ActivityÐèÒªÒ»¸ö¶¥²ãLego¹ÜÀí
ÈÕ¼£Ê×Ò³ÆÀÂÛÔÞ

public FeedCommentLikeLego (Context
context, Activity activity, ViewGroup parentView,
HomeFeedItem feedItem, int feedType) {
super(context, parentView);
mHomeFeedItem = feedItem;
mFeedItem = feedItem.mFeedBasicItem;
mActivity = activity;
mFeedType = feedType;
mLikeManager = (LikeManager) SuperManager.getAppManager (SuperManager.LIKE_MANAGER);
mParentView = LayoutInflater.from(context).inflate (R.layout.qqstory_feed_commentlike_view,
parentView, true);
// Ò³Ãæ½á¹¹
FeedCommentLego commentLego = new FeedCommentLego (mContext,
mParentView, mFeedItem, mFeedType);
FeedLikeLego likeLego = FeedLikeLego.createIndexFeedLikeLego (mContext,
activity, mParentView, mFeedItem, mFeedType);
addLego (LEGO_KEY_COMMENT, commentLego);
addLego (LEGO_KEY_LIKE, likeLego);
commentLego.feed (mHomeFeedItem.getCommentList());
likeLego.feed (mHomeFeedItem.getLikeEntryList());
boot();
} |
´ÓFeedCommentLikeLegoµÄ¹¹Ôì·½·¨£¬ÎÒÃǵÃÖª
ÎÒÊǰְ֣¬ÎÒÓÐÁ½¸ö¶ù×Ó
ÎÒÁ½¸ö¶ù×Ó²»ÕùÆø£¬ÐèÒªÎÒÀ´Î¹ÑøÊý¾Ý£¬×Ô¼º²»»áÕõÇ®£¨×Ô¼º²»ÀÊý¾Ý£©
È«¼ÒÎÒÊÇÒ»¼ÒÖ®Ö÷£¬Æô¶¯ÎÒ˵ÁËË㣨LegoÆô¶¯bootºó£¬»á×Ô¼ºÀÊý¾Ý×Ô¼ºäÖȾ£¬Í¬Ê±×ÓLegoÒ²»áÏà¼Ìboot£©
ÈÕ¼£710ÕâÀï¾ÍÓг¡¾°£¬ÌåÑé³öLegoÇл»Êý¾ÝÔ´µÄÓÅÊÆ¡£
¡¾Ê×Ò³¡¿³öÓÚÐÔÄÜÓÅ»¯£¬¶¼»á×öÇëÇóºÏ²¢¡£·µ»Ø¶à¸öFeedµÄÊÓÆµÁÐ±í£¬ÆÀÂÛÔÞÁбíÊý¾Ý¡£
commentLego.feed(mHomeFeedItem.getCommentList());
likeLego.feed(mHomeFeedItem.getLikeEntryList()); |
±»Î¹ÑøÊý¾Ýºó£¬LegoÄÚ²¿µÄDataProvider½«²»Æô¶¯
¡¾ÏêÇéÒ³¡¿Í¬Ò»Lego£¬Ä¬ÈÏÇé¿ö¾Í»áÆô¶¯×ʽðµÄDataProvider£¬»á×Ô¼ºÀÊý¾Ý
@Override
public LegoDataProvider getDataProvider() {
return new FeedLikeDataProvider(this, mIsDetailPage);
} |
Ò»¸öLegoÀàÊǾ¿¾¹ÊÇʲô£¿LegoÀàÖ®¼äµÄŦ´ø£¿
´ó²¿·ÖÒ³ÃæµÄäÖȾÁ÷³ÌÏߣ¬ÈçÏÂͼ

ÎÒÃǰÑÕâЩ³£ÓõÄÍøÂçÇëÇ󣬴¦ÀíÊý¾Ý£¬Ê¼þ°ó¶¨£¬Éϱ¨£¬ÈÝ´í´¦ÀíµÈһϵÁÐÂß¼·½·¨£¬ÒÔÒ³Ãæ¿éΪµ¥Î»·â×°³ÉÒ»¸öLegoÄ£¿é¡£
ÕâÑùµÄÒ»¸ö³éÏó²ãLego£¬ÎÒÃÇ¿ÉÒÔÇåÎúµØ¿´µ½¸ÃÒ³Ãæ¿é£¬ÇëÇóµÄÊý¾ÝÊÇʲô£¬°ó¶¨ÁËʲôʼþ£¬×öÁËʲôÉϱ¨£¬³ö´íÔõô´¦Àí¡£
×îºó¼ÓÉÏÉúÃüÖÜÆÚ£¬Ò³Ãæ½á¹¹»¯µÄLego£¬ÒѾËãÊÇÒ»¸öÍêÕûµÄ¹¦Äܵ¥ÔªÁË¡£
¼Ì³ÐLegoBase£¬Óм¸¸öºËÐĵķ½·¨ÐèÒªÖØÐ´£º

»¹ÓÐÉúÃüÖÜÆÚ·½·¨¿ÉÒÔÖØÐ´£¬µ«²»ÊDZØÒªµÄ¡£
ÄãÔĶÁ/½ÓÊÖÒ»¸öLegoÀ࣬»áÊǼþºÜÇáËɵÄÊÂÇé¡£Ò»¸öLegoÀ࣬ºËÐÄ·½·¨Õ⼸¸ö£¬ÆäÓà¶¼ÊÇÒµÎñÂß¼·½·¨¡£
¸ÄʼþÈ¥¸ÃLegoµÄEventHandler£¬Êý¾ÝÒª¸ÄÈ¥DataProvider£¬²úÆ·ÒªÇó´óV²Åչʾµ×²¿Î²°Í£¬ºÃ£¬È¥render·½·¨ÕÒ¡£
LegoÖ®¼äµÄŦ´ø£¬ÓÐÈý¸ö£º
parentView£¨¹«ÓÃxml£©
feedData£¨¹«ÓÃÊý¾Ý£©
getLego£¨Lego¹ØÏµ£©
Î壬×ܽá
LegoµÄºËÐÄ˼ÏëÊÇ£ºÒ³Ãæ½á¹¹·ÖÄ£¿é£¬·Ö¶øÖÎÖ®¡£½âñ´úÂë¿É¶ÁÐԸߣ¬µ×²ãͳһÓÅ»¯¡£
ÔÚʹÓÃÁËÁ½¸ö°æ±¾Ö®ºó£¬¸Ð¾õÍê³É¶È»¹ÊDz»¹»¡£
¶¥²ãLegoÇé¿ö¸´ÔÓ£¬µ×²ãͳһÓÅ»¯²»ºÃ×ö
½Ó¿ÚÖ®¼äÔ¼Êø£¬²»¹»×ÔÓÉ
µ«ÊǶԱÈMVP£¬LegoÄÜÌåÑé³öÇá±ã£¬Âß¼ÇåÎú£¬·½·¨ÊýÁ¿ÉÙµÄÓÅÊÆ¡£
LegoÒ³Ãæ½á¹¹»¯µÄÓ¦ÓÃÆäʵ»¹ÔÚ³¢ÊԽ׶Ρ£ÒÔÉÏËãÎÒµÄһЩ¸öÈË˼¿¼ºÍ×ܽᡣ |