RxJava ,OKhttp ,fastJson的合用的MVP框架

         最近比较流行RxJava 这个技术,网上也很多相关的学习资料,这里我先列举一些大神给的讲解:

         1. 抛物线大神的:给android开发者的RxJava详解

         2. 彻底搞懂RxJava.(一共三篇)

         3.最后肯定少不了就是源码了


        基本上,只要你精读了,那么你对RxJava就有不少的了解了。也明白这个框架在现在的是有多流行。在经验不算多的我看来,开发app。

        使用一个MVP的框架,通过RxJava来进行响应消息的传递,是一个相对比较完整而且整齐的框架了。而使用Okhttp,也为你的网络请求省了不少时间。

        

         还是说回最近研究的一个主题吧,就是使用RxJava,和OKhttp结合的一个http的请求。这些在MVP框架中都属于M这个层级只中的,在没有使用这些框架的时候,会发现自己做的http请求不如人意,消息的传递在callback hell中纠结。okhttp是国外大神写的一个速度快,而且完善的http请求。RxJava就是为解决callback hell的神器。为什么这里还多了个fastjson 呢。这个fastjson是我们对网络数据传递,还有网络数据回来进行解析的,以便真正的给app端调用。

      

        首先简单讲讲目录结构:没有专门分文件夹,全部放在一个包里面。

         


        1.OktestActivity  就是V, 通过一个接口IOKView ,给P端进行调用.

        2.OKPresenter, P端,这个通过接口进行UI的更新,而对于M回来的数据,会进行进一步的处理,而和M之间的交互,就是通过RxJava来进行的。

        3.OKModel,这个是服务端,也是数据请求的一端,例如常见的有读写数据库、网络请求等,这端主要记录一些网络请求的,而当中是使用了OKHttp进行了数据的请求。

        4.BigDataBean,这个是网络请求回来的json数据,通过这个fastJson, 解析成为这个类型的的数据。


      V端代码:OktestActivity.java

      代码很简单,其实主要使用了ButterKnife 进行注入操作,然后就是调用P层的方法。提供接口给P层进行更新UI.

       

package com.xuan.moveforever.app_move.HTTP_RX_test.okHttpTest;

import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;

import com.xuan.moveforever.R;

import butterknife.Bind;
import butterknife.ButterKnife;
import butterknife.OnClick;

public class OktestActivity extends AppCompatActivity implements IOKView{

    @Bind(R.id.ok_get)
    Button ok_get;

    @Bind(R.id.ok_post)
    Button ok_post;

    @Bind(R.id.ok_reset)
    Button ok_reset;

    @Bind(R.id.text_response)
    TextView text_response;

    @OnClick({R.id.ok_get,R.id.ok_post,R.id.ok_reset})
    void onClickListener (View view) {
        switch (view.getId()) {
            case R.id.ok_get:
                okGet();
                break;
            case R.id.ok_post:
                okPost();
                break;
            case R.id.ok_reset:
                okReset();
                break;
        }
    }

    private OKPresenter presenter;

    private void okGet(){
        presenter.okGet();
    }
    private void okPost(){
        presenter.okPost();
    }
    private void okReset(){
        presenter.okReset();
    }

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_oktest);
        ButterKnife.bind(this);
        presenter= new OKPresenter(this);
    }

    @Override
    public void setTextResponse(String s) {
        text_response.setText(s);
    }
}

      P端代码:

      P层主要的操作就是调用M层的网络请求,然后数据是通过RxJava回来的,调用M层,返回的是一个 Observable<Object>  ,一个RxJava的被观察者的对象。subscribeOn主要是设定了被观察者所处的线程,observeOn,设定的是观察者所处的线程。最后观察者会得到M层回来的数据,进行进一步的处理(P层的主要作用,处理M层回来的数据),最后就是通过接口对View,UI进行刷新的工作。

package com.xuan.moveforever.app_move.HTTP_RX_test.okHttpTest;

import android.util.Log;

import rx.Subscriber;
import rx.android.schedulers.AndroidSchedulers;
import rx.schedulers.Schedulers;

/**
 * Created by xuanweijian on 2016/2/18.
 */
public class OKPresenter {
    IOKView mView;
    private OKModel model;

    public OKPresenter(IOKView view){
        this.mView = view;
        model = new OKModel();
    }

    public void okGet(){
        model.okGet().subscribeOn(Schedulers.newThread())
                     .observeOn(AndroidSchedulers.mainThread())
                     .subscribe(subscriber);
    }

    public void okGet2(){
        model.okGet2().subscribeOn(Schedulers.newThread())
                      .observeOn(AndroidSchedulers.mainThread())
                      .subscribe(subscriber2);
    }

    public void okPost(){
        model.okPost().subscribeOn(Schedulers.newThread())
                .observeOn(AndroidSchedulers.mainThread())
                .subscribe(subscriber3);
    }

    public void okReset(){
        okGet2();
    }

    //利用Rx 放回的处理数据
    Subscriber<String> subscriber = new Subscriber<String>() {
        @Override
        public void onCompleted() {
            Log.i("RX", "onCompleted");
        }

        @Override
        public void onError(Throwable e) {
            Log.i("RX","error");
        }

        @Override
        public void onNext(String s) {
            Log.i("RX","next");
            Log.i("RX","display--"+Thread.currentThread().getName());
            mView.setTextResponse(s);
        }
    };

    Subscriber<Object> subscriber2 = new Subscriber<Object>() {
        @Override
        public void onCompleted() {
            Log.i("RX", "onCompleted");
        }

        @Override
        public void onError(Throwable e) {
            Log.i("RX","error"+"--"+ e);
        }

        @Override
        public void onNext(Object o) {
            BigDataBean bean = (BigDataBean)o;
            mView.setTextResponse(bean.TodayVolume+"---"+bean.TotalIncome+"---"+bean.TotalTradingVol+"---"+bean.YesterdayVolume);
        }
    };

    Subscriber<Object> subscriber3 = new Subscriber<Object>() {
        @Override
        public void onCompleted() {
            Log.i("RX", "onCompleted");
        }

        @Override
        public void onError(Throwable e) {
            Log.i("RX","error"+"--"+ e);
        }

        @Override
        public void onNext(Object o) {
            BigDataBean bean = (BigDataBean)o;
            mView.setTextResponse(bean.TodayVolume+"---"+bean.TotalIncome+"---"+bean.TotalTradingVol+"---"+bean.YesterdayVolume);
        }
    };
}

     M层代码:

     这层只是对Okhttp 进行调用,还有对其进行进一步的封装,代码太多,就不贴出来了,其实主要就是调用网络,然后创建一个RxJava的被观察者的类,然后异步进行网络请求,最后得到的Json数据,利用FastJson,进行解析,在P层就直接得到了 JavaBean的类型,直接明了。

package com.xuan.moveforever.app_move.HTTP_RX_test.okHttpTest;


import com.xuan.okhttp.OkHttpUtils;

import java.io.IOException;

import okhttp3.Call;
import okhttp3.OkHttpClient;
import okhttp3.Request;
import okhttp3.Response;
import rx.Observable;
import rx.Subscriber;
import rx.schedulers.Schedulers;

/**
 * Created by xuanweijian on 2016/2/18.
 */
public class OKModel {
    public OKModel(){

    }

    /**
     * 原始的OK操作
     * @return
     */
    public Observable<String> okGet(){
        return Observable.create(new Observable.OnSubscribe<String>() {
            @Override
            public void call(Subscriber<? super String> subscriber) {
                try {
                    OkHttpClient mClinet = new OkHttpClient();
                    final Request request = new Request.Builder()
                            .url("XXXXXXXXXXX")
                            .build();
                    Call call = mClinet.newCall(request);
                    Response response = call.execute();
                    String s=response.body().string();
                    subscriber.onNext(s);
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }).observeOn(Schedulers.io());
    }

    //Rx 结合 OKhttp 的封装。
    public Observable<Object> okGet2(){
        return OkHttpUtils
                .get()
                .url("xxxxxxxxxxxx")
                .build()
                .execute2(BigDataBean.class);
    }

    public Observable<Object> okPost(){
        return OkHttpUtils.postString()
                .url("xxxxxxxxxxxxxxxx")
                .content("" + System.currentTimeMillis())
                .build()
                .execute2(BigDataBean.class);
    }

    public Observable<String> okReset(){
        return null;
    }
}



      最后,这个MVP框架加上RxJava,其实能够很好的构建一个app,并且其拓展性非常好,感觉这是近来App构建的一大利器。不过相对而言,MVP在构建的时候,比一Activity 流来的复杂点,但也很明显,这样比一Activity流要清晰明了,架构分明。


         

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值