-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathatom.xml
82 lines (69 loc) · 16.1 KB
/
atom.xml
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
<title>hpw123</title>
<link href="/atom.xml" rel="self"/>
<link href="https://SuperMan42.github.io/"/>
<updated>2016-11-28T03:01:37.000Z</updated>
<id>https://SuperMan42.github.io/</id>
<author>
<name>hpw123</name>
</author>
<generator uri="http://hexo.io/">Hexo</generator>
<entry>
<title></title>
<link href="https://SuperMan42.github.io/2016/11/28/MVP%E5%BF%AB%E9%80%9F%E5%BC%80%E5%8F%91%E6%A1%86%E6%9E%B6/"/>
<id>https://SuperMan42.github.io/2016/11/28/MVP快速开发框架/</id>
<published>2016-11-28T03:00:57.000Z</published>
<updated>2016-11-28T03:01:37.000Z</updated>
<content type="html"><![CDATA[<h1 id="MVP"><a href="#MVP" class="headerlink" title="MVP"></a>MVP</h1><p>项目<a href="https://github.com/SuperMan42/MVP" target="_blank" rel="external">github</a>地址<a href="https://github.com/SuperMan42/MVP" target="_blank" rel="external">https://github.com/SuperMan42/MVP</a></p>
<p>App based on Material Design + MVP + Rxjava + Retrofit + Okhttp + Glide + Cache + theme + others</p>
<p>本项目本着简洁的思想,让开发更加简单,抽取出了core做为库,可以直接引入进行快捷开发,项目仍在改进中,如果有好的建议或者发现什么问题欢迎<a href="https://github.com/SuperMan42/MVP/issues" target="_blank" rel="external">issue</a>,email<a href="mailto:424346976@qq.com">424346976@qq.com</a>,如果感觉对你有帮助也欢迎点个star,fork,本项目仅做学习交流使用</p>
<p>QQ群:482866708<br><img src="https://github.com/SuperMan42/MVP/blob/master/share.png?raw=true" alt=""></p>
<h2 id="Preview"><a href="#Preview" class="headerlink" title="Preview"></a>Preview</h2><ol>
<li>总览(列表)<br><img src="https://github.com/SuperMan42/MVP/raw/master/1.gif" alt=""> </li>
<li>图片选择器和表情键盘(支持动态表情和emoji表情等)<br><img src="https://github.com/SuperMan42/MVP/raw/master/2.gif" alt=""> </li>
<li>夜间和日间模式切换<br><img src="https://github.com/SuperMan42/MVP/raw/master/3.gif" alt=""> </li>
</ol>
<p><a href="http://pro-app-mt.fir.im/85bcc48436a73ec65be41df573fd81ecbfc7f377.apk?AWSAccessKeyId=e0cada7f00f2465b929656d799937873&Expires=1479991896&Signature=RAHMsJ6bxPgxQxpDStKNj9rC3dE%3D&filename=app-release.apk_1.0.apk" target="_blank" rel="external">Download APK</a><br>(Android 5.0 or above) </p>
<p><img src="https://github.com/SuperMan42/MVP/raw/master/download.png" alt=""></p>
<h2 id="Points"><a href="#Points" class="headerlink" title="Points"></a>Points</h2><ul>
<li>使用Rxjava配合Retrofit2+okhttp做网络请求和缓存</li>
<li>使用RxUtil对线程操作和网络请求结果处理做了封装</li>
<li>使用RxManager对订阅生命周期做了统一管理</li>
<li>使用RxBus做了组件间通信</li>
<li>使用RxPermissions对android6.0进行权限申请</li>
<li>使用Material Design控件和动画</li>
<li>使用MVP架构整个项目,并且抽取出core做为库,导入core即可省去50%的代码开发哦</li>
<li>使用Glide做图片处理和加载</li>
<li>使用Fragmentation简化Fragment的操作和懒加载</li>
<li>日间和夜间模式切换</li>
<li>添加了图片选择器(高仿微信)和表情键盘(支持动态表情)</li>
<li>自己封装了recyclerview和recyclerviewpager实现下拉刷新,上拉加载更多和pagerview功能(只需简单几句代码即可实现各种列表,无需adapter,无需自己设计分页加载)</li>
<li>使用x5WebView做阅览页</li>
<li>日报首页的头部可以循环滚动(使用了rxjava轮循和recyclerviewpager)</li>
</ul>
<h2 id="使用"><a href="#使用" class="headerlink" title="使用"></a>使用</h2><p>1.导入core库 </p>
<figure class="highlight plain"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div><div class="line">4</div><div class="line">5</div><div class="line">6</div><div class="line">7</div><div class="line">8</div><div class="line">9</div><div class="line">10</div><div class="line">11</div><div class="line">12</div><div class="line">13</div><div class="line">14</div><div class="line">15</div><div class="line">16</div><div class="line">17</div><div class="line">18</div><div class="line">19</div><div class="line">20</div><div class="line">21</div><div class="line">22</div><div class="line">23</div><div class="line">24</div><div class="line">25</div><div class="line">26</div></pre></td><td class="code"><pre><div class="line"></div><div class="line">dependencies {</div><div class="line"> compile 'com.hpw.mvpframe:core:1.0.0'</div><div class="line">}</div><div class="line"></div><div class="line">``` </div><div class="line">2.接口定义(demo) </div><div class="line"></div><div class="line">``` </div><div class="line">abstract class DailyPresenter extends CoreBasePresenter<DailyModel, DailyView> {</div><div class="line"> public abstract void getDailyData();</div><div class="line"></div><div class="line"> public abstract void startInterval();</div><div class="line"> }</div><div class="line"></div><div class="line"> interface DailyModel extends CoreBaseModel {</div><div class="line"> Observable<DailyListBean> getDailyData();</div><div class="line"></div><div class="line"> Observable<ZhihuDetailBean> getZhihuDetails(int anInt);</div><div class="line"> }</div><div class="line"></div><div class="line"> interface DailyView extends CoreBaseView {</div><div class="line"> void showContent(DailyListBean info);</div><div class="line"></div><div class="line"> void doInterval(int i);</div><div class="line"> }</div></pre></td></tr></table></figure>
<p>model(只处理数据)<br>presenter(用来处理vm的业务逻辑)<br>view(界面交互) </p>
<p>3.实现model(demo)</p>
<figure class="highlight plain"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div><div class="line">4</div><div class="line">5</div><div class="line">6</div><div class="line">7</div><div class="line">8</div><div class="line">9</div><div class="line">10</div><div class="line">11</div><div class="line">12</div></pre></td><td class="code"><pre><div class="line">public class DailyModel implements ZhihuContract.DailyModel {</div><div class="line"></div><div class="line"> @Override</div><div class="line"> public Observable<DailyListBean> getDailyData() {</div><div class="line"> return RxService.createApi(ZhiHuApi.class).getDailyList().compose(RxUtil.rxSchedulerHelper());</div><div class="line"> }</div><div class="line"></div><div class="line"> @Override</div><div class="line"> public Observable<ZhihuDetailBean> getZhihuDetails(int anInt) {</div><div class="line"> return RxService.createApi(ZhiHuApi.class).getDetailInfo(anInt).compose(RxUtil.rxSchedulerHelper());</div><div class="line"> }</div><div class="line">}</div></pre></td></tr></table></figure>
<p>4.实现presenter(demo)</p>
<figure class="highlight plain"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div><div class="line">4</div><div class="line">5</div><div class="line">6</div><div class="line">7</div><div class="line">8</div><div class="line">9</div><div class="line">10</div><div class="line">11</div><div class="line">12</div><div class="line">13</div><div class="line">14</div><div class="line">15</div><div class="line">16</div><div class="line">17</div><div class="line">18</div><div class="line">19</div><div class="line">20</div><div class="line">21</div><div class="line">22</div><div class="line">23</div><div class="line">24</div><div class="line">25</div><div class="line">26</div><div class="line">27</div><div class="line">28</div><div class="line">29</div><div class="line">30</div><div class="line">31</div><div class="line">32</div><div class="line">33</div></pre></td><td class="code"><pre><div class="line">public class DailyPresenter extends ZhihuContract.DailyPresenter {</div><div class="line"> private int topCount = 0;</div><div class="line"> private int currentTopCount = 0;</div><div class="line"></div><div class="line"> @Override</div><div class="line"> public void onStart() {</div><div class="line"></div><div class="line"> }</div><div class="line"></div><div class="line"> @Override</div><div class="line"> public void getDailyData() {</div><div class="line"> mRxManager.add(mModel</div><div class="line"> .getDailyData()</div><div class="line"> .subscribe(</div><div class="line"> dailyListBean -> {</div><div class="line"> mView.showContent(dailyListBean);</div><div class="line"> topCount = dailyListBean.getTop_stories().size();</div><div class="line"> }, e -> mView.showError("数据加载失败ヽ(≧Д≦)ノ")</div><div class="line"> ));</div><div class="line"> }</div><div class="line"></div><div class="line"> @Override</div><div class="line"> public void startInterval() {</div><div class="line"> mRxManager.add(Observable.interval(5, TimeUnit.SECONDS)</div><div class="line"> .compose(RxUtil.rxSchedulerHelper())</div><div class="line"> .subscribe(aLong -> {</div><div class="line"> if (currentTopCount == topCount)</div><div class="line"> currentTopCount = 0;</div><div class="line"> mView.doInterval(currentTopCount++);</div><div class="line"> }</div><div class="line"> ));</div><div class="line"> }</div><div class="line">}</div></pre></td></tr></table></figure>
<p>三者的创建无先后顺序,按自己的业务逻辑来<br>RxManage用于管理订阅者,观察者以及事件<br>发送事件:<code>mRxManage.post(Constants.msg, user);</code><br>接受事件:<code>mRxManage.on(Constants.msg, arg ->mView.initUserInfo((_User) arg));</code> </p>
<p>5.列表的实现 </p>
<figure class="highlight plain"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div><div class="line">4</div><div class="line">5</div><div class="line">6</div><div class="line">7</div><div class="line">8</div><div class="line">9</div><div class="line">10</div><div class="line">11</div><div class="line">12</div><div class="line">13</div><div class="line">14</div><div class="line">15</div><div class="line">16</div><div class="line">17</div><div class="line">18</div><div class="line">19</div><div class="line">20</div><div class="line">21</div><div class="line">22</div><div class="line">23</div><div class="line">24</div><div class="line">25</div><div class="line">26</div><div class="line">27</div><div class="line">28</div><div class="line">29</div><div class="line">30</div><div class="line">31</div><div class="line">32</div><div class="line">33</div><div class="line">34</div><div class="line">35</div><div class="line">36</div><div class="line">37</div><div class="line">38</div><div class="line">39</div><div class="line">40</div><div class="line">41</div><div class="line">42</div></pre></td><td class="code"><pre><div class="line">public class WechatFragment extends CoreBaseFragment<WechatPresenter, WechatModel> implements ZhihuContract.WechatView {</div><div class="line"> CoreRecyclerView coreRecyclerView;</div><div class="line"> private static int pageNum = 10;</div><div class="line"></div><div class="line"> @Override</div><div class="line"> public int getLayoutId() {</div><div class="line"> return 0;</div><div class="line"> }</div><div class="line"></div><div class="line"> @Override</div><div class="line"> public View getLayoutView() {</div><div class="line"> coreRecyclerView = new CoreRecyclerView(mContext).init(new BaseQuickAdapter<WXItemBean, BaseViewHolder>(R.layout.item_weichat) {</div><div class="line"> @Override</div><div class="line"> protected void convert(BaseViewHolder helper, WXItemBean item) {</div><div class="line"> Glide.with(mContext).load(item.getPicUrl()).crossFade().into((ImageView) helper.getView(R.id.iv_wechat_item_image));</div><div class="line"> helper.setText(R.id.tv_wechat_item_title, item.getTitle())</div><div class="line"> .setText(R.id.tv_wechat_item_from, item.getDescription())</div><div class="line"> .setText(R.id.tv_wechat_item_time, item.getCtime())</div><div class="line"> .setOnClickListener(R.id.ll_click, v -> {</div><div class="line"> WechatDetailsActivity.start(mContext, item.getTitle(), item.getUrl());</div><div class="line"> });</div><div class="line"> }</div><div class="line"> }).openLoadMore(pageNum, page -> mPresenter.getWechatData(pageNum, page))</div><div class="line"> .openRefresh();</div><div class="line"> return coreRecyclerView;</div><div class="line"> }</div><div class="line"></div><div class="line"> @Override</div><div class="line"> public void initUI(View view, @Nullable Bundle savedInstanceState) {</div><div class="line"></div><div class="line"> }</div><div class="line"></div><div class="line"> @Override</div><div class="line"> public void showContent(List<WXItemBean> mList) {</div><div class="line"> coreRecyclerView.getAdapter().addData(mList);</div><div class="line"> }</div><div class="line"></div><div class="line"> @Override</div><div class="line"> public void showError(String msg) {</div><div class="line"> coreRecyclerView.showLoadMoreFailedView();</div><div class="line"> }</div><div class="line">}</div></pre></td></tr></table></figure>
<p>无需自己创建adapter,无需自己写下拉刷新和上拉加载更多的逻辑(只要添加<code>openLoadMore(pageSize, addDataListener) openRefresh()</code>即可实现刷新和加载)<br>无需写xml布局文件(也可写,demo里两种实现方式)只需要在<code>getLayoutView()</code> 中 return </p>
<figure class="highlight plain"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div><div class="line">4</div><div class="line">5</div><div class="line">6</div></pre></td><td class="code"><pre><div class="line">new CoreRecyclerView(mContext).init(new BaseQuickAdapter<WXItemBean, BaseViewHolder>(R.layout.item_weichat) {</div><div class="line"> @Override</div><div class="line"> protected void convert(BaseViewHolder helper, WXItemBean item) {</div><div class="line"> //viewholder </div><div class="line"> }</div><div class="line">})</div></pre></td></tr></table></figure>
<p>即可实现列表(使用recyclerviewpager也是如初简单,具体看demo,recyclerviewpager可以实现viewpager所有功能)</p>
<h2 id="TODO"><a href="#TODO" class="headerlink" title="TODO"></a>TODO</h2><ol>
<li>添加aop</li>
<li>继续优化 </li>
<li>还有很多。。。</li>
</ol>
<h2 id="Thanks"><a href="#Thanks" class="headerlink" title="Thanks"></a>Thanks</h2><p><a href="https://github.com/izzyleung/ZhihuDailyPurify/wiki/%E7%9F%A5%E4%B9%8E%E6%97%A5%E6%8A%A5-API-%E5%88%86%E6%9E%90" target="_blank" rel="external">知乎日报API</a> <a href="http://www.tianapi.com/#wxnew" target="_blank" rel="external">微信精选API</a> </p>
]]></content>
<summary type="html">
<h1 id="MVP"><a href="#MVP" class="headerlink" title="MVP"></a>MVP</h1><p>项目<a href="https://github.com/SuperMan42/MVP" target="_blank" rel=
</summary>
</entry>
</feed>