MVPArms MVP快速集成框架

rice_jiang 8年前
   <h2><strong>前言</strong></h2>    <ul>     <li> <p>今年的Android技术圈中 MVP , Dagger2 , Rxjava , Retrofit 这些词汇非常火,随便打开一个技术论坛都充斥着大量的关于这些技术的文章, Github 也充斥着各种以 基于MVP+Retrofit+RxJava+Dagger2+MaterialDesign开发的xxxx 为标题的开源项目或 <strong>Demo</strong> .</p> </li>     <li> <p>但是大家这么热心的开源此类项目,一直重复的做着同样的事 教授大家使用的方式和技巧 有没有想过依赖一个第三方库,就可以快速的搭建此类框架?</p> </li>    </ul>    <h2><strong>What is MVPArms?</strong></h2>    <ul>     <li> <p>MVPArms 是一个集成了大量 <strong>Android</strong> 主流框架,并且全部使用 <strong>Dagger2</strong> 管理,以及提供API将所有库连接起来方便使用,还提供详细的 <a href="/misc/goto?guid=4959714738616443549" rel="nofollow,noindex"> <strong>Wiki文档</strong> </a> .</p> </li>     <li> <p>它可以使开发后面的所有项目都不用重复的复制粘贴(用过此类框架的朋友应该知道,这些库都依赖其它的库,就算一个build.gradle都会浪费很多时间),一个依赖省去很多烦恼,而且对于新手来说这些框架难的不仅仅是API的使用,更难的是怎么把它们结合到一起,应对各种场景的使用.</p> </li>     <li> <p>对于一个新的 <strong>Android</strong> 项目,特别是熟练使用 <strong>Dagger2</strong> 和 <strong>Rxjava</strong> 的开发者,你们只需要将此项目 <strong>Clone</strong> 下来, <strong>Demo</strong> 只实现了一个页面,将此页面删除掉,添加所需要的 <strong>Retrofit</strong> <strong>API</strong> ,你的框架就搭建好了,你就可以直接使用 <strong>Demo</strong> 进行后续的开发,包结构也适合后面的扩展.</p> </li>    </ul>    <h2><strong>Feature</strong></h2>    <ul>     <li>支持大型项目的开发方便扩展,Demo的包结构直接可以拿来用</li>     <li>全部使用 Dagger2 管理</li>     <li>大量使用 Rxjava</li>     <li>提供 Mvp 基类,快速接入</li>     <li>全部 UI 自适应</li>     <li>图片加载类 <strong>ImageLoader</strong> 使用策略模式和建造者模式,轻松切换图片加载框架和扩展</li>     <li>Model层提供Retrofit API和缓存,是否使用缓存自行选择</li>     <li>全局 http <strong>Request</strong> ( <strong>Params</strong> , <strong>headers</strong> ) <strong>Response</strong> ( <strong>Params</strong> , <strong>耗时</strong> )信息监听,可解析json后根据状态码做相应操作</li>     <li>全局 Rxjava 错误处理,错误后自动重试</li>    </ul>    <h2><strong>Where?</strong></h2>    <p><a href="/misc/goto?guid=4959714738710100208" rel="nofollow,noindex">MVPArms欢迎 <strong>Star</strong> 和 <strong>Fork</strong> </a></p>    <h2><strong>Structure</strong></h2>    <p><img src="https://simg.open-open.com/show/8620098a47322adb8d7dcd7ed21762a6.png"></p>    <h2><strong>How?</strong></h2>    <h2><strong>Wiki</strong></h2>    <p><a href="/misc/goto?guid=4959714738616443549" rel="nofollow,noindex">详细用法请参照Wiki,下面只是简单的介绍下MVP</a></p>    <h2><strong>Contract</strong></h2>    <p>根据 Google <a href="/misc/goto?guid=4959714738814087366" rel="nofollow,noindex"> 官方的 <strong>MVP</strong> 项目 </a> ,可以在 <strong>Contract</strong> 中定义 <strong>MVP</strong> 的接口,便于管理,此框架使用 <a href="/misc/goto?guid=4958870694214783028" rel="nofollow,noindex"> Dagger </a> 注入 <strong>Presenter</strong> 无需定义 <strong>Presenter</strong> 接口,所以 <strong>Contract</strong> 只定义 <strong>Model</strong> 和 <strong>View</strong> 的接口</p>    <pre>  <code class="language-java">public interface UserContract {      //对于经常使用的关于UI的方法可以定义到BaseView中,如显示隐藏进度条,和显示文字消息      interface View extends BaseView {          void setAdapter(DefaultAdapter adapter);          void startLoadMore();          void endLoadMore();      }      //Model层定义接口,外部只需关心model返回的数据,无需关心内部细节,及是否使用缓存      interface Model {          Observable<List<User>> getUsers(int lastIdQueried, boolean update);      }  }</code></pre>    <h2><strong>View</strong></h2>    <p>一般让 <strong>Activity</strong> 或 <strong>Fragment</strong> 实现 <strong>Contract</strong> 中定义的 <strong>View</strong> 接口,供 <strong>Presenter</strong> 调用对应方法操作 <strong>UI</strong> , <strong>BaseActivity</strong> 默认注入 <strong>Presenter</strong> ,如想使用 <strong>Presenter</strong> ,必须指定 <strong>Presenter的范型</strong> ,和实现 <strong>setupActivityComponent</strong> 来提供 <strong>Presenter</strong> 需要的 <a href="/misc/goto?guid=4959714738920799337" rel="nofollow,noindex"> <strong>Component</strong> </a> 和 <a href="/misc/goto?guid=4959714739016287233" rel="nofollow,noindex"> <strong>Module</strong> </a></p>    <pre>  <code class="language-java">public class UserActivity extends WEActivity<UserPresenter> implements UserContract.View {        @Override      protected void setupActivityComponent(AppComponent appComponent) {          DaggerUserComponent                  .builder()                  .appComponent(appComponent)                  .userModule(new UserModule(this))                  .build()                  .inject(this);        }        @Override      protected View initView() {          return LayoutInflater.from(this).inflate(R.layout.activity_user, null, false);      }        @Override      protected void initData() {         }  }</code></pre>    <h2><strong>Model</strong></h2>    <p>Model实现 <strong>Contract</strong> 的 <strong>Model</strong> 接口,并且继承 <strong>BaseModel</strong> ,指定范型为 <a href="/misc/goto?guid=4959714739099892508" rel="nofollow,noindex"> <strong>ServiceManager</strong> </a> 和 <a href="/misc/goto?guid=4959714739184504727" rel="nofollow,noindex"> <strong>CacheManager</strong> </a> ,然后通过两个 <strong>Manager</strong> 拿到需要的 <strong>Service</strong> 和 <strong>Cache</strong> 为 <strong>Presenter</strong> 提供需要的数据(是否使用缓存请自行选择, <strong>Presenter</strong> 无需关心细节)</p>    <pre>  <code class="language-java">public class UserModel extends BaseModel<ServiceManager,CacheManager> implements UserContract.Model{      private CommonService mCommonService;      private CommonCache mCommonCache;        public UserModel(ServiceManager serviceManager, CacheManager cacheManager) {          super(serviceManager, cacheManager);          this.mCommonService = mServiceManager.getCommonService();          this.mCommonCache = mCacheManager.getCommonCache();      }        @Override      public Observable<List<User>> getUsers(int lastIdQueried, boolean update) {        }    }</code></pre>    <h2><strong>Presenter</strong></h2>    <p>Presenter在 <strong>MVP</strong> 中的大部分的作用为通过从 <strong>Model</strong> 层接口获取数据,在调用 <strong>View</strong> 层接口显示数据,首先实现 <strong>BasePresenter</strong> ,指定 <strong>Model</strong> 和 <strong>View</strong> 的范型,注意一定要指定 <strong>Contract</strong> 中定义的接口, <strong>Presenter</strong> 需要的 <strong>Model</strong> 和 <strong>View</strong> ,都使用 <strong>Dagger2</strong> 注入,这样即解藕又方便测试, <a href="/misc/goto?guid=4959714739266168567" rel="nofollow,noindex">怎么注入?</a></p>    <pre>  <code class="language-java">@ActivityScope  public class UserPresenter extends BasePresenter<UserContract.Model, UserContract.View> {        @Inject      public UserPresenter(UserContract.Model model, UserContract.View rootView) {          super(model, rootView);      }      //这里定义业务方法,相应用户的交互      public void requestUsers(final boolean pullToRefresh) {      }  }</code></pre>    <h3> </h3>    <p> </p>    <p>来自:http://www.jianshu.com/p/48e66e879061</p>    <p> </p>