安卓RxJava+Okhttp+Retrofit

一、添加依赖:
//导入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();


}

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

曾今一脸懵逼的萌新走向大神之路

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值