OKHttp + RxJava请求数据

来源:互联网 发布:黑客帝国矩阵革命 bt 编辑:程序博客网 时间:2024/06/05 02:42

很多人对于现在的网络请求需求都非常不一样,下面我给大家介绍一种网络请求的一种方式: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.添加权限

<uses-permission android:name="android.permission.INTERNET"/>

3.实现代码:

MainActivity的xml文件:

<?xml version="1.0" encoding="utf-8"?><RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"    xmlns:tools="http://schemas.android.com/tools"    android:layout_width="match_parent"    android:layout_height="match_parent"    tools:context="liuhao.baway.com.retrofit_demo.MainActivity">    <TextView        android:id="@+id/textview"        android:layout_centerInParent="true"        android:layout_width="wrap_content"        android:layout_height="wrap_content"        android:text="显示获取的数据" /></RelativeLayout>

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<BaseBean>() {                    @Override                    public void call(Subscriber<? super BaseBean> 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<BaseBean>() {                            @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();    }}
效果:


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



原创粉丝点击