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(); }}效果:
效果已经呈现,就先写到这里,感觉有用的可以拿去参考,谢谢大家支持!!!
阅读全文
0 0
- OKHttp + RxJava请求数据
- RXjava加okhttp 请求请求网络数据
- MVP+Rxjava+Okhttp+Retrofit+XRecyclerview请求数据
- rxjava,okhttp 合并请求
- Okhttp网络请求+Rxjava
- MVP和Retrofit+Rxjava+OkHttp封装结合请求数据
- rxjava 结合okhttp 连续请求
- 网络请求框架 Rxjava+ReTrofit+okHttp+MVP
- rxjava+Retrofit+okhttp 实战网络请求
- 网络请求篇--Retrofit2.0+RxJava+OkHttp
- 封装Retrofit + okhttp + rxjava网络请求框架
- OKHttp请求网络数据
- OkHttp请求json数据
- OkHttp网络数据请求
- okhttp请求json数据
- recycleview+okhttp请求数据
- okhttp网络请求数据
- OkHttp同步请求数据
- 自定义view之环形进度条加数字
- 将图片设置为网页的背景
- 不戴金箍如何救你,带了金箍如何愛你
- 织梦cms内核vip解析包
- java设计模式 ——观察者模式
- OKHttp + RxJava请求数据
- Fragment的切换方法
- Git的基本使用
- xUtils+自定义listview+绘图
- 滑动fragment的两种方法
- bzoj 3372: [Usaco2004 Feb]Moo University -- Financial Aid 财政补助 二分
- centos7没有分配ip
- 欢迎使用CSDN-markdown编辑器
- Linux下pip安装教程