OKHttp + RxJava请求数据

很多人对于现在的网络请求需求都非常不一样,下面我给大家介绍一种网络请求的一种方式:OKHttp+ RxJava

OKHttp本身就是用来请求网络数据的,前面封装的OK处理异步用的是Handler对象,这篇文章就是将Handler替换成了最近使用的一种处理异步的框架RxJava

具体使用

1.添加依赖

RxJava的依赖:

compile 'io.reactivex:rxjava:1.0.14'
compile 'io.reactivex:rxandroid:1.0.1'
OKHttp的依赖:
compile 'com.squareup.okhttp3:okhttp:3.9.0'

解析数据使用的gson依赖:

compile 'com.google.code.gson:gson:2.2.4'

2.添加权限

3.实现代码:

MainActivity的xml文件:




    



MainActivity页面的实现逻辑:

import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.widget.TextView;
import android.widget.Toast;

public class MainActivity extends AppCompatActivity {

    private TextView tv;
    private String url = "http://120.27.23.105/product/getCarts?uid=106";

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        tv = (TextView) findViewById(R.id.textview);

        OkHttpUntils.getOkHttpUntils(this).get(url, BaseBean.class, new NetClickListener() {
            @Override
            public void Suesses(BaseBean baseBean) {
                if(baseBean.getCode().equals("0")){
                    tv.setText(baseBean.getMsg());
                }
            }
            @Override
            public void Error(String msg) {
                  Toast.makeText(MainActivity.this, msg,Toast.LENGTH_SHORT).show();
            }
        });
    }
}

请求网络所用到的网络请求数据的封装类,在这里我用到了单例模式,保证使用唯一的实例。

import android.content.Context;
import com.google.gson.Gson;
import java.io.IOException;
import okhttp3.Call;
import okhttp3.Callback;
import okhttp3.OkHttpClient;
import okhttp3.Request;
import okhttp3.Response;
import rx.Observable;
import rx.Subscriber;
import rx.android.schedulers.AndroidSchedulers;
import rx.schedulers.Schedulers;

public class OkHttpUntils {

    private Context context ;

    private static OkHttpUntils okHttpUntils ;

    private OkHttpUntils(Context context){
         this.context = context ;
    }

    public static OkHttpUntils getOkHttpUntils(Context context){
          if(okHttpUntils==null){
                synchronized (OkHttpUntils.class){
                    if(okHttpUntils==null){
                        okHttpUntils = new OkHttpUntils(context);
                    }
                }
          }
        return okHttpUntils;
    }

    public void get(String url, final Class clazz, final NetClickListener netClickListener){

        Request request = new Request.Builder()
                .get()
                .url(url)
                .build();
        OkHttpClient.Builder  okbuild = new OkHttpClient.Builder();
        okbuild.addInterceptor(new LogInterceptor())
                .build()
                .newCall(request).enqueue(new Callback() {
            @Override
            public void onFailure(Call call, IOException e) {
                if(netClickListener!=null){
                     netClickListener.Error(e.getMessage().toString());
                }
            }

            @Override
            public void onResponse(Call call, Response response) throws IOException {
                final String string = response.body().string();
                Observable.create(new Observable.OnSubscribe() {
                    @Override
                    public void call(Subscriber subscriber) {
                        Gson gson = new Gson();
                        BaseBean o = (BaseBean) gson.fromJson(string, clazz);
                        if(o!=null){
                            subscriber.onNext(o);
                            subscriber.onCompleted();
                        }else {
                            subscriber.onError(new NullPointerException("请求数据为空"));
                        }
                    }
                }).subscribeOn(Schedulers.io())
                        .observeOn(AndroidSchedulers.mainThread()).subscribe(new Subscriber() {
                            @Override
                            public void onCompleted() {

                            }

                            @Override
                            public void onError(Throwable e) {
                                if(netClickListener!=null){
                                    netClickListener.Error(e.getMessage().toString());
                                }
                            }

                            @Override
                            public void onNext(BaseBean baseBean) {
                                if(netClickListener!=null){
                                    if(baseBean.getCode().equals("0")){
                                        netClickListener.Suesses(baseBean);
                                    }
                                }
                            }
                        });

            }
        });
    }

}
bean类:
public class BaseBean {

    private String msg ;
    private String code ;

    public String getMsg() {
        return msg;
    }

    public void setMsg(String msg) {
        this.msg = msg;
    }

    public String getCode() {
        return code;
    }

    public void setCode(String code) {
        this.code = code;
    }
}
接口:
public interface NetClickListener {

    void Suesses(BaseBean baseBean);
    void Error(String msg);

}
打印拦截器:

import android.util.Log;
import java.io.IOException;
import okhttp3.FormBody;
import okhttp3.Interceptor;
import okhttp3.MediaType;
import okhttp3.Request;
import okhttp3.Response;
import okhttp3.ResponseBody;

public class LogInterceptor implements Interceptor {


    public static String TAG = "LogInterceptor";

    @Override
    public Response intercept(Interceptor.Chain chain) throws IOException {
        Request request = chain.request();
        long startTime = System.currentTimeMillis();
        Response response = chain.proceed(chain.request());
        long endTime = System.currentTimeMillis();
        long duration=endTime-startTime;
        MediaType mediaType = response.body().contentType();
        String content = response.body().string();
        Log.d(TAG,"\n");
        Log.d(TAG,"----------Start----------------");
        Log.d(TAG, "| "+request.toString());
        String method=request.method();
        if("POST".equals(method)){
            StringBuilder sb = new StringBuilder();
            if (request.body() instanceof FormBody) {
                FormBody body = (FormBody) request.body();
                for (int i = 0; i < body.size(); i++) {
                    sb.append(body.encodedName(i) + "=" + body.encodedValue(i) + ",");
                }
                sb.delete(sb.length() - 1, sb.length());
                Log.d(TAG, "| RequestParams:{"+sb.toString()+"}");
            }
        }
        Log.d(TAG, "| Response:" + content);
        Log.d(TAG,"----------End:"+duration+"毫秒----------");
        return response.newBuilder()
                .body(ResponseBody.create(mediaType, content))
                .build();
    }
}
效果:

OKHttp + RxJava请求数据_第1张图片


效果已经呈现,就先写到这里,感觉有用的可以拿去参考,谢谢大家支持!!!



你可能感兴趣的:(OKHttp + RxJava请求数据)