一、添加依赖:
//导入RxJava依赖
implementation ‘io.reactivex.rxjava2:rxandroid:2.0.2’
implementation ‘io.reactivex.rxjava2:rxjava:2.0.2’
//Okhttp依赖
implementation ‘com.squareup.okhttp3:okhttp:3.10.0’
//Retrifit依赖
compile ‘com.squareup.retrofit2:retrofit:2.3.0’
//为Retrofit设置Rxjava的依赖
compile ‘com.squareup.retrofit2:adapter-rxjava2:2.3.0’
//为Retrofit设置Gson的依赖
compile ‘com.squareup.retrofit2:converter-gson:2.3.0’
二、设置RxJava
import android.util.Log;
import io.reactivex.Observable;
import io.reactivex.ObservableEmitter;
import io.reactivex.ObservableOnSubscribe;
import io.reactivex.Observer;
import io.reactivex.disposables.Disposable;
import io.reactivex.functions.Function;
import io.reactivex.functions.Predicate;
import io.reactivex.schedulers.Schedulers;
/**
* Created by liangxq on 2018/7/2.
*/
public class Rx_android {
public static void createObservable() {
//被观察者对象
Observable observable = Observable.create(new ObservableOnSubscribe() {
@Override
public void subscribe(ObservableEmitter emitter) throws Exception {
emitter.onNext("12313123");
emitter.onNext(downLoadJson("网络请求数据"));
emitter.onNext("fndfgjg");
emitter.onNext("uiouiokyk");
//完成发射
emitter.onComplete();
}
});
//通过被观察者调用subscribe注册一个观察者对象(observer)
observable.subscribe(new Observer() {
@Override
public void onSubscribe(Disposable d) {
}
@Override
public void onNext(Object o) {
Log.e("liangxq", o.toString());
}
@Override
public void onError(Throwable e) {
Log.e("liangxq", e.getMessage());
}
@Override
public void onComplete() {
Log.e("liangxq", "onComplete");
}
});
}
public static String downLoadJson(String str){
String string=str;
// Log.e(“liangxq”,str);
return string;
}
/**
* From----->FromArray
*
* 将数组对象转换成对象一次输出
*/
public static void from(){
Integer []integers={1,2,3,4,5};
Observable<Integer>observable=Observable.fromArray(integers);
observable.subscribe(new Observer<Integer>() {
@Override
public void onSubscribe(Disposable d) {
}
@Override
public void onNext(Integer integer) {
Log.e("liangxq",integer+"");
}
@Override
public void onError(Throwable e) {
}
@Override
public void onComplete() {
Log.e("liangxq","执行完成");
}
});
}
/**
*
*/
public static void just(){
Integer[]integers1={1,2,3,4,5,6};
Integer[]integers2={7,8,9,10,11};
Observable<Integer[]> observable = Observable.just(integers1, integers2);
observable.subscribe(new Observer<Integer[]>() {
@Override
public void onSubscribe(Disposable d) {
}
@Override
public void onNext(Integer[] integers) {
for(int i=0;i<integers.length;i++){
Log.e("liangxq",integers[i]+"");
}
}
@Override
public void onError(Throwable e) {
}
@Override
public void onComplete() {
}
});
}
public static void filter() {
Observable<Integer> observable = Observable.just(1, 2, 3, 4, 5, 6);
observable.filter(new Predicate<Integer>() {
@Override
public boolean test(Integer integer) throws Exception {
return integer < 5;
}
}).subscribe(new Observer<Integer>() {
@Override
public void onSubscribe(Disposable d) {
}
@Override
public void onNext(Integer integer) {
Log.e("liangxq", integer + "");
}
@Override
public void onError(Throwable e) {
}
@Override
public void onComplete() {
}
});
}
/**
* Map操作符
* 假设有一个数据结构『学生』,现在需要打印出一组学生的名字
* 将一个对象转换成另一个对象
*/
public static void map() {
Student[] students = new Student[10];
for (int i = 0; i < 10; i++) {
students[i] = new Student("liangxq" + i, i);
}
Observable<String> observable = Observable.fromArray(students).map(new Function<Student, String>() {
@Override
public String apply(Student student) throws Exception {
return student.getName();
}
});
observable.subscribe(new Observer<String>() {
@Override
public void onSubscribe(Disposable d) {
}
@Override
public void onNext(String s) {
Log.e("liangxq", s);
}
@Override
public void onError(Throwable e) {
}
@Override
public void onComplete() {
}
});
}
}
三、设置拦截器
import android.content.Context;
import android.net.ConnectivityManager;
import android.net.NetworkInfo;
import android.util.Log;
import java.io.File;
import java.io.IOException;
import java.util.concurrent.TimeUnit;
import io.reactivex.Observable;
import io.reactivex.Observer;
import io.reactivex.Scheduler;
import io.reactivex.android.schedulers.AndroidSchedulers;
import io.reactivex.disposables.Disposable;
import io.reactivex.schedulers.Schedulers;
import okhttp3.Cache;
import okhttp3.CacheControl;
import okhttp3.Interceptor;
import okhttp3.OkHttpClient;
import okhttp3.Request;
import okhttp3.Response;
import okhttp3.ResponseBody;
import retrofit2.Retrofit;
import retrofit2.adapter.rxjava2.RxJava2CallAdapterFactory;
import retrofit2.http.GET;
/**
* Created by liangxq on 2018/7/3.
*/
public class MyInterceptor {
public static Context context;
public MyInterceptor(Context context) {
this.context = context;
}
public void interceptor() {
Retrofit.Builder builder = new Retrofit.Builder();
OkHttpClient.Builder builder1 = new OkHttpClient.Builder();
//创建缓存文件的路径
File file=new File(context.getCacheDir(),"cache");
//设置缓存文件的大小
Cache cache=new Cache(file,1024*1024*10);
//利用Okhttp的Buidler对象添加操作
OkHttpClient okHttpClient = builder1.connectTimeout(5, TimeUnit.SECONDS)
.readTimeout(5, TimeUnit.SECONDS)
.writeTimeout(5, TimeUnit.SECONDS)
//设置缓存文件
.cache(cache)
//应用拦截器
.addInterceptor(new LogIntertor())
//添加缓存的配置
.addInterceptor(new CacheInterceptis())
.addNetworkInterceptor(new LogIntertor())
.build();
//
Retrofit retrofit = builder.baseUrl(Myserver.url)
.client(okHttpClient)
.addCallAdapterFactory(RxJava2CallAdapterFactory.create()).build();
Myserver myserver = retrofit.create(Myserver.class);
Observable<ResponseBody> observable = myserver.getData();
observable.subscribeOn(Schedulers.io()).observeOn(AndroidSchedulers.mainThread()).subscribe(new Observer<ResponseBody>() {
@Override
public void onSubscribe(Disposable d) {
}
@Override
public void onNext(ResponseBody responseBody) {
try {
Log.e("liangxq", responseBody.string());
} catch (IOException e) {
e.printStackTrace();
}
}
@Override
public void onError(Throwable e) {
Log.e("liangxq", e.getMessage());
}
@Override
public void onComplete() {
}
});
}
interface Myserver {
public final String url = " http://gank.io/api/xiandu/";
public final String url2 = " http://www.baidu.com";
@GET("categories")
Observable<ResponseBody> getData();
}
/**
* 日志拦截器
*/
static class LogIntertor implements okhttp3.Interceptor {
@Override
public Response intercept(Chain chain) throws IOException {
Request request = chain.request();
Log.e("liangxq", request.url() + "\n头信息" + request.toString());
//新的请求体对象
request = request.newBuilder()
.url(Myserver.url2)
.get()
//添加请求头
.header("User-Agent", "liangxq").build();
Response response = chain.proceed(request);
//新的响应体
ResponseBody response1 = response.peekBody(1024 * 1024);
Log.e("liangxq", "拦截器" + response1.string());
return response;
}
}
static class CacheInterceptis implements Interceptor {
@Override
public Response intercept(Chain chain) throws IOException {
//获取请求体对象
Request request = chain.request();
//没网的时候使用缓存
if (!isNetworkConnected()) {
//请求体设置强制使用缓存
request = request.newBuilder().cacheControl(CacheControl.FORCE_CACHE).build();
}
Response response = chain.proceed(request);
if (isNetworkConnected()) {
return response;
}
/**
*
*/
//没网的时候返回设置了缓存的响应头
return response.newBuilder()
.header("Cache-Control", "public, only-if-cached, max-stale=15")
.removeHeader("Pragma")
.removeHeader("Cache-Control")
.build();
}
}
/**
* 判断是否有网
*
* @return
*/
public static boolean isNetworkConnected() {
ConnectivityManager mConnectivityManager = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
NetworkInfo mNetworkInfo = mConnectivityManager.getActiveNetworkInfo();
if (mNetworkInfo != null) {
return mNetworkInfo.isAvailable();
}
return false;
}
}
四、建立观察者对象
import java.io.IOException;
import io.reactivex.Observable;
import io.reactivex.ObservableEmitter;
import io.reactivex.ObservableOnSubscribe;
import okhttp3.Call;
import okhttp3.Callback;
import okhttp3.OkHttpClient;
import okhttp3.Request;
import okhttp3.Response;
/**
* Created by liangxq on 2018/7/1.
*/
public class DownLoadUtils {
private OkHttpClient okHttpClient;
public DownLoadUtils() {
okHttpClient = new OkHttpClient();
}
/**
* 声明一个被观察者对象,作为结果返回
* @param path
* @return
*/
public Observable<byte[]> downLoadImage(final String path) {
return Observable.create(new ObservableOnSubscribe<byte[]>() {
@Override
public void subscribe(final ObservableEmitter<byte[]> emitter) throws Exception {
if (!emitter.isDisposed()) {
final Request request = new Request.Builder().url(path).build();
Call call = okHttpClient.newCall(request);
call.enqueue(new Callback() {
@Override
public void onFailure(Call call, IOException e) {
}
@Override
public void onResponse(Call call, Response response) throws IOException {
if (response.isSuccessful()) {
byte[] data = response.body().bytes();
if (data != null) {
emitter.onNext(data);
}
}
}
});
}
}
});
}
}
五、创建类Student
public class Student {
public Student(String name, int age) {
this.name = name;
this.age = age;
}
private String name;
private int age;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
}
六、创建Bean对象
import java.util.List;
/**
* Created by liangxq on 2018/7/3.
*/
public class Bean {
/**
* error : false
* results : [{"_id":"57c83777421aa97cbd81c74d","en_name":"wow","name":"科技资讯","rank":1},{"_id":"57c83577421aa97cb162d8b1","en_name":"apps","name":"趣味软件/游戏","rank":5},{"_id":"57c83627421aa97cbd81c74b","en_name":"imrich","name":"装备党","rank":50},{"_id":"57c836b4421aa97cbd81c74c","en_name":"funny","name":"草根新闻","rank":100},{"_id":"5827dc81421aa911e32d87cc","en_name":"android","name":"Android","rank":300},{"_id":"582c5346421aa95002741a8e","en_name":"diediedie","name":"创业新闻","rank":340},{"_id":"5829c2bc421aa911e32d87e7","en_name":"thinking","name":"独立思想","rank":400},{"_id":"5827dd7b421aa911d3bb7eca","en_name":"iOS","name":"iOS","rank":500},{"_id":"5829b881421aa911dbc9156b","en_name":"teamblog","name":"团队博客","rank":600}]
*/
private boolean error;
private List<ResultsBean> results;
public boolean isError() {
return error;
}
public void setError(boolean error) {
this.error = error;
}
public List<ResultsBean> getResults() {
return results;
}
public void setResults(List<ResultsBean> results) {
this.results = results;
}
public static class ResultsBean {
/**
* _id : 57c83777421aa97cbd81c74d
* en_name : wow
* name : 科技资讯
* rank : 1
*/
private String _id;
private String en_name;
private String name;
private int rank;
public String get_id() {
return _id;
}
public void set_id(String _id) {
this._id = _id;
}
public String getEn_name() {
return en_name;
}
public void setEn_name(String en_name) {
this.en_name = en_name;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getRank() {
return rank;
}
public void setRank(int rank) {
this.rank = rank;
}
}
}
七、在MainActivity里加载网络数据
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.ImageView;
import com.liangxq.interceptor.MyInterceptor;
import java.io.IOException;
import java.util.concurrent.TimeUnit;
import io.reactivex.Observable;
import io.reactivex.ObservableEmitter;
import io.reactivex.ObservableOnSubscribe;
import io.reactivex.Observer;
import io.reactivex.Scheduler;
import io.reactivex.android.schedulers.AndroidSchedulers;
import io.reactivex.disposables.Disposable;
import io.reactivex.schedulers.Schedulers;
import okhttp3.Call;
import okhttp3.Callback;
import okhttp3.Interceptor;
import okhttp3.OkHttpClient;
import okhttp3.Request;
import okhttp3.Response;
import okhttp3.ResponseBody;
import retrofit2.Retrofit;
import retrofit2.adapter.rxjava2.RxJava2CallAdapterFactory;
import retrofit2.converter.gson.GsonConverterFactory;
import retrofit2.http.GET;
import retrofit2.http.Url;
public class MainActivity extends AppCompatActivity {
private Button button;
private ImageView imageView;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
button = findViewById(R.id.button);
imageView = findViewById(R.id.imageView);
button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
// okhttpdownLoadImage();
// retrofitRxAndroid();
MyInterceptor myInterceptor = new MyInterceptor(MainActivity.this);
myInterceptor.interceptor();
}
});
}
private void okhttpdownLoadImage() {
/**
* 被观察这对象
*
* 执行网络请求操作。
*/
Observable<byte[]> observable = Observable.create(new ObservableOnSubscribe<byte[]>() {
@Override
public void subscribe(final ObservableEmitter<byte[]> emitter) throws Exception {
//网络请求
OkHttpClient.Builder builder = new OkHttpClient.Builder();
OkHttpClient okHttpClient = builder.connectTimeout(5, TimeUnit.SECONDS).build();
Request.Builder builder1 = new Request.Builder();
final Request request = builder1.get().url("https://timgsa.baidu.com/timg?image&quality=80&size=b9999_10000&sec=1530525793821&di=cb94f51ebcdeab31d90bd68464c2ecc2&imgtype=0&src=http%3A%2F%2Fpic23.photophoto.cn%2F20120629%2F0036036835167128_b.jpg").build();
Call call = okHttpClient.newCall(request);
call.enqueue(new Callback() {
@Override
public void onFailure(Call call, IOException e) {
}
@Override
public void onResponse(Call call, Response response) throws IOException {
//发送数据
emitter.onNext(response.body().bytes());
}
});
}
});
observable
//被观察者网络请求在子线程中
.subscribeOn(Schedulers.io())
//切换回UI线程
.observeOn(AndroidSchedulers.mainThread())
//注册观察者对象
.subscribe(new Observer<byte[]>() {
@Override
public void onSubscribe(Disposable d) {
}
@Override
public void onNext(byte[] bytes) {
Bitmap bitmap = BitmapFactory.decodeByteArray(bytes, 0, bytes.length);
imageView.setImageBitmap(bitmap);
}
@Override
public void onError(Throwable e) {
}
@Override
public void onComplete() {
}
});
}
public void retrofitRxAndroid() {
Retrofit.Builder builder = new Retrofit.Builder();
Retrofit retrofit = builder.baseUrl(Myserver.url)
//配置Rxjava
.addCallAdapterFactory(RxJava2CallAdapterFactory.create())
//配置Gson
.addConverterFactory(GsonConverterFactory.create())
.build();
Myserver myserver = retrofit.create(Myserver.class);
Observable<Bean> observable = myserver.getData();
observable
//设置被观察者在子线程当中
.subscribeOn(Schedulers.io())
//设置观察者在主线程中
.observeOn(AndroidSchedulers.mainThread())
.subscribe(new Observer<Bean>() {
@Override
public void onSubscribe(Disposable d) {
}
@Override
public void onNext(Bean bean) {
Log.e("liangxq", bean.getResults().toString());
}
@Override
public void onError(Throwable e) {
}
@Override
public void onComplete() {
Log.e("liangxq", "请求完成");
}
});
}
interface Myserver {
public final String url = "http://gank.io/api/xiandu/";
//设置返回的是Observsble对象
@GET("categories")
Observable<Bean> getData();
}
}