安卓中MVP模式和RxAndroid的具体实现例子
来源:互联网 发布:opencv车流量统计算法 编辑:程序博客网 时间:2024/05/16 02:52
版权声明:本文为博主原创文章,转载请注明原地址。
目录(?)[+]
安卓中MVP模式和RxAndroid的具体实现例子
MVP模式和RxAndroid是两个东西,这里因为懒得分开写,所以写到了一起写到了同一个例子里面。
MVP是什么
参考博客:框架模式MVP在Android中的使用
在MVC框架中,View是可以直接读取Model模型中的数据的,Model模型数据发生改变是会通知View数据显示发生相应的改变。
而在MVP中Model和View之间的没有任何联系,是两个完全独立的模块,当Model模型发生数据改变时,通过Presenter通知View视图发生相应的UI改变。
根据单一职责原则,Activity主要起到用户交互作用,也就是接收用户输入,显示请求结果。因此可以通过MVP框架模式来减轻Activity的职责。
RxAndroid是什么
Github:ReactiveX/RxAndroid
参考博客:给 Android 开发者的 RxJava 详解
RxAndroid可以简单高度概括为“异步”。
异步操作很关键的一点是程序的简洁性,因为在调度过程比较复杂的情况下,异步代码经常会既难写也难被读懂。 Android 创造的 AsyncTask 和Handler ,其实都是为了让异步代码更加简洁。RxJava 的优势也是简洁,但它的简洁的与众不同之处在于,随着程序逻辑变得越来越复杂,它依然能够保持简洁。
具体例子代码
对MVP和RxAndroid不了解的可以去上面说的博客去看一下,都是很好的博客,感谢大牛分享!
我这里以最简单粗暴的方式贴出代码,建议先上手再研究,先能够让程序跑起来,再去研究代码里面的实现原理。
引入RxAndroid:在dependencies下面加入如下代码
compile ‘io.reactivex:rxandroid:1.0.1’
compile ‘io.reactivex:rxjava:1.0.14’
bean
这里是一个简单的例子,User只有一个属性。
<code class="language-java hljs has-numbering"><span class="hljs-keyword">package</span> com.regulus.rxandroidtest;<span class="hljs-keyword">public</span> <span class="hljs-class"><span class="hljs-keyword">class</span> <span class="hljs-title">User</span> {</span> <span class="hljs-keyword">public</span> String name; <span class="hljs-keyword">public</span> <span class="hljs-title">User</span>(String name) { <span class="hljs-keyword">this</span>.name = name; }}</code><ul style="" class="pre-numbering"><li>1</li><li>2</li><li>3</li><li>4</li><li>5</li><li>6</li><li>7</li><li>8</li><li>9</li></ul>
Model
<code class="language-java hljs has-numbering"><span class="hljs-keyword">package</span> com.regulus.rxandroidtest;<span class="hljs-keyword">import</span> android.os.SystemClock;<span class="hljs-keyword">import</span> rx.Observable;<span class="hljs-keyword">import</span> rx.Subscriber;<span class="hljs-keyword">public</span> <span class="hljs-class"><span class="hljs-keyword">class</span> <span class="hljs-title">UserModel</span> {</span> <span class="hljs-keyword">public</span> Observable<User> <span class="hljs-title">getUser</span>() { <span class="hljs-keyword">return</span> Observable.create(<span class="hljs-keyword">new</span> Observable.OnSubscribe<User>() { <span class="hljs-annotation">@Override</span> <span class="hljs-keyword">public</span> <span class="hljs-keyword">void</span> <span class="hljs-title">call</span>(Subscriber<? <span class="hljs-keyword">super</span> User> subscriber) { <span class="hljs-comment">// 设置个2000ms的延迟,模拟网络访问、数据库操作等等延时操作</span> SystemClock.sleep(<span class="hljs-number">2000</span>);<span class="hljs-comment">// final User user = null;</span> <span class="hljs-keyword">final</span> User user = <span class="hljs-keyword">new</span> User(<span class="hljs-string">"赵日天"</span>); <span class="hljs-keyword">if</span> (user == <span class="hljs-keyword">null</span>) { subscriber.onError(<span class="hljs-keyword">new</span> Exception(<span class="hljs-string">"User = null"</span>)); } <span class="hljs-keyword">else</span> { subscriber.onNext(user); subscriber.onCompleted(); } } }); }}</code><ul style="" class="pre-numbering"><li>1</li><li>2</li><li>3</li><li>4</li><li>5</li><li>6</li><li>7</li><li>8</li><li>9</li><li>10</li><li>11</li><li>12</li><li>13</li><li>14</li><li>15</li><li>16</li><li>17</li><li>18</li><li>19</li><li>20</li><li>21</li><li>22</li><li>23</li><li>24</li><li>25</li><li>26</li><li>27</li><li>28</li><li>29</li></ul>
View
定义View的接口,把Activity看成View,实现View接口。
Activity只负责监听点击等事件,然后反馈给Presenter,由Presenter调度。
<code class="language-java hljs has-numbering"><span class="hljs-keyword">package</span> com.regulus.rxandroidtest;<span class="hljs-keyword">public</span> <span class="hljs-class"><span class="hljs-keyword">interface</span> <span class="hljs-title">UserView</span> {</span> <span class="hljs-keyword">void</span> updateView(User user); <span class="hljs-keyword">void</span> showProgressDialog(); <span class="hljs-keyword">void</span> hideProgressDialog(); <span class="hljs-keyword">void</span> showError(String msg);}</code><ul style="" class="pre-numbering"><li>1</li><li>2</li><li>3</li><li>4</li><li>5</li><li>6</li><li>7</li><li>8</li><li>9</li><li>10</li><li>11</li><li>12</li></ul>
<code class="language-java hljs has-numbering"><span class="hljs-keyword">package</span> com.regulus.rxandroidtest;<span class="hljs-keyword">import</span> android.app.ProgressDialog;<span class="hljs-keyword">import</span> android.content.Context;<span class="hljs-keyword">import</span> android.os.Bundle;<span class="hljs-keyword">import</span> android.support.v7.app.AppCompatActivity;<span class="hljs-keyword">import</span> android.view.View;<span class="hljs-keyword">import</span> android.widget.TextView;<span class="hljs-keyword">import</span> android.widget.Toast;<span class="hljs-keyword">public</span> <span class="hljs-class"><span class="hljs-keyword">class</span> <span class="hljs-title">MainActivity</span> <span class="hljs-keyword">extends</span> <span class="hljs-title">AppCompatActivity</span> <span class="hljs-keyword">implements</span> <span class="hljs-title">UserView</span> {</span> <span class="hljs-keyword">private</span> Context context; <span class="hljs-keyword">private</span> TextView mTvShow; <span class="hljs-keyword">private</span> ProgressDialog mProgressDialog; <span class="hljs-keyword">private</span> UserPresenter mUserPresenter; <span class="hljs-annotation">@Override</span> <span class="hljs-keyword">protected</span> <span class="hljs-keyword">void</span> <span class="hljs-title">onCreate</span>(Bundle savedInstanceState) { <span class="hljs-keyword">super</span>.onCreate(savedInstanceState); setContentView(R.layout.activity_main); context = <span class="hljs-keyword">this</span>; mUserPresenter = <span class="hljs-keyword">new</span> UserPresenter(<span class="hljs-keyword">this</span>); mProgressDialog = <span class="hljs-keyword">new</span> ProgressDialog(context); mProgressDialog.setMessage(<span class="hljs-string">"正在加载,请稍后.."</span>); mTvShow = (TextView) findViewById(R.id.tv_show); findViewById(R.id.btn_update).setOnClickListener(<span class="hljs-keyword">new</span> View.OnClickListener() { <span class="hljs-annotation">@Override</span> <span class="hljs-keyword">public</span> <span class="hljs-keyword">void</span> <span class="hljs-title">onClick</span>(View v) { mUserPresenter.getUser(); } }); } <span class="hljs-annotation">@Override</span> <span class="hljs-keyword">public</span> <span class="hljs-keyword">void</span> <span class="hljs-title">updateView</span>(User user) { <span class="hljs-keyword">if</span> (user == <span class="hljs-keyword">null</span>) <span class="hljs-keyword">return</span>; mTvShow.setText(user.name); } <span class="hljs-annotation">@Override</span> <span class="hljs-keyword">public</span> <span class="hljs-keyword">void</span> <span class="hljs-title">showProgressDialog</span>() { mProgressDialog.show(); } <span class="hljs-annotation">@Override</span> <span class="hljs-keyword">public</span> <span class="hljs-keyword">void</span> <span class="hljs-title">hideProgressDialog</span>() { mProgressDialog.hide(); } <span class="hljs-annotation">@Override</span> <span class="hljs-keyword">public</span> <span class="hljs-keyword">void</span> <span class="hljs-title">showError</span>(String msg) { Toast.makeText(context, msg, Toast.LENGTH_SHORT).show(); }}</code><ul style="" class="pre-numbering"><li>1</li><li>2</li><li>3</li><li>4</li><li>5</li><li>6</li><li>7</li><li>8</li><li>9</li><li>10</li><li>11</li><li>12</li><li>13</li><li>14</li><li>15</li><li>16</li><li>17</li><li>18</li><li>19</li><li>20</li><li>21</li><li>22</li><li>23</li><li>24</li><li>25</li><li>26</li><li>27</li><li>28</li><li>29</li><li>30</li><li>31</li><li>32</li><li>33</li><li>34</li><li>35</li><li>36</li><li>37</li><li>38</li><li>39</li><li>40</li><li>41</li><li>42</li><li>43</li><li>44</li><li>45</li><li>46</li><li>47</li><li>48</li><li>49</li><li>50</li><li>51</li><li>52</li><li>53</li><li>54</li><li>55</li><li>56</li><li>57</li><li>58</li><li>59</li><li>60</li><li>61</li></ul>
Presenter
Presenter相当于MVC中的控制器,负责Model和View的沟通。
<code class="language-java hljs has-numbering"><span class="hljs-keyword">package</span> com.regulus.rxandroidtest;<span class="hljs-keyword">import</span> rx.Subscriber;<span class="hljs-keyword">import</span> rx.android.schedulers.AndroidSchedulers;<span class="hljs-keyword">import</span> rx.schedulers.Schedulers;<span class="hljs-javadoc">/** * Presenter作为Model和View通讯的桥梁,需要持有它们的引用。 */</span><span class="hljs-keyword">public</span> <span class="hljs-class"><span class="hljs-keyword">class</span> <span class="hljs-title">UserPresenter</span> {</span> <span class="hljs-keyword">private</span> UserView mUserView; <span class="hljs-keyword">private</span> UserModel mUserModel; <span class="hljs-keyword">public</span> <span class="hljs-title">UserPresenter</span>(UserView mUserView) { <span class="hljs-keyword">this</span>.mUserView = mUserView; mUserModel = <span class="hljs-keyword">new</span> UserModel(); } <span class="hljs-keyword">public</span> <span class="hljs-keyword">void</span> <span class="hljs-title">getUser</span>() { mUserView.showProgressDialog(); <span class="hljs-comment">// 这里如果使用 Lambda 会更简洁</span> mUserModel.getUser() .subscribeOn(Schedulers.io())<span class="hljs-comment">// 在非UI线程中执行getUser</span> .observeOn(AndroidSchedulers.mainThread())<span class="hljs-comment">// 在UI线程中执行结果</span> .subscribe(<span class="hljs-keyword">new</span> Subscriber<User>() { <span class="hljs-annotation">@Override</span> <span class="hljs-keyword">public</span> <span class="hljs-keyword">void</span> <span class="hljs-title">onNext</span>(User user) { mUserView.updateView(user); } <span class="hljs-annotation">@Override</span> <span class="hljs-keyword">public</span> <span class="hljs-keyword">void</span> <span class="hljs-title">onCompleted</span>() { mUserView.hideProgressDialog(); } <span class="hljs-annotation">@Override</span> <span class="hljs-keyword">public</span> <span class="hljs-keyword">void</span> <span class="hljs-title">onError</span>(Throwable e) { mUserView.showError(e.getMessage()); mUserView.hideProgressDialog(); } }); }}</code><ul style="" class="pre-numbering"><li>1</li><li>2</li><li>3</li><li>4</li><li>5</li><li>6</li><li>7</li><li>8</li><li>9</li><li>10</li><li>11</li><li>12</li><li>13</li><li>14</li><li>15</li><li>16</li><li>17</li><li>18</li><li>19</li><li>20</li><li>21</li><li>22</li><li>23</li><li>24</li><li>25</li><li>26</li><li>27</li><li>28</li><li>29</li><li>30</li><li>31</li><li>32</li><li>33</li><li>34</li><li>35</li><li>36</li><li>37</li><li>38</li><li>39</li><li>40</li><li>41</li><li>42</li><li>43</li><li>44</li><li>45</li></ul>
博客大部分都是代码,文笔实在不好……
- 安卓中MVP模式和RxAndroid的具体实现例子
- 安卓中MVP模式和RxAndroid的具体实现例子
- 安卓中MVP模式和RxAndroid的具体实现例子
- 安卓中MVP模式和RxAndroid的具体实现例子
- Mvp+Rxandroid+Retrofit的简单实现
- 谈一谈MVP开发模式,具体实现。
- 如何在MVP模式中控制RxAndroid的生命周期?
- Android MVP设计模式登录具体实现Material Design风格
- 使用RxAndroid配合MVP模式实现异步网络请求,更新ui
- 通过Rxjava和RxAndroid实现的EventBus
- Android一个mvp模式的小例子
- Rxandroid与MVP的结合(demo)
- MVP+rxAndroid+Material开发的一款APP
- Android:MVP模式例子
- Android MVP模式例子
- Strategy模式的具体实现
- 使用retrofit框架的网络请求方法使用例子,同时+MVP +rxjava + rxandroid使用
- 使用retrofit框架的网络请求方法使用例子,同时+MVP +rxjava + rxandroid使用
- Nginx源码编译安装
- Nginx安装upstream-fair模块(第三方模块)
- 理解BitSet
- 三次握手和四次挥手协议
- 关于NFC芯片选择的一些记录
- 安卓中MVP模式和RxAndroid的具体实现例子
- Android 记录一次开发微信分享功能的吐槽与思考
- cas配置与自定义开发
- Android路由框架设计与实现
- 网线
- AngularJS Promise
- PyGobject(二十七)布局容器之PopoverMenu
- Train Problem II hdu 1023
- UIView添加背景视差效果(MotionEffect)