array(2) { ["docs"]=> array(10) { [0]=> array(10) { ["id"]=> string(3) "428" ["text"]=> string(77) "Visual Studio 2017 单独启动MSDN帮助(Microsoft Help Viewer)的方法" ["intro"]=> string(288) "目录 ECharts 异步加载 ECharts 数据可视化在过去几年中取得了巨大进展。开发人员对可视化产品的期望不再是简单的图表创建工具,而是在交互、性能、数据处理等方面有更高的要求。 chart.setOption({ color: [ " ["username"]=> string(8) "DonetRen" ["tagsname"]=> string(55) "Visual Studio 2017|MSDN帮助|C#程序|.NET|Help Viewer" ["tagsid"]=> string(23) "[401,402,403,"300",404]" ["catesname"]=> string(0) "" ["catesid"]=> string(2) "[]" ["createtime"]=> string(10) "1511400964" ["_id"]=> string(3) "428" } [1]=> array(10) { ["id"]=> string(3) "427" ["text"]=> string(42) "npm -v;报错 cannot find module "wrapp"" ["intro"]=> string(288) "目录 ECharts 异步加载 ECharts 数据可视化在过去几年中取得了巨大进展。开发人员对可视化产品的期望不再是简单的图表创建工具,而是在交互、性能、数据处理等方面有更高的要求。 chart.setOption({ color: [ " ["username"]=> string(4) "zzty" ["tagsname"]=> string(50) "node.js|npm|cannot find module "wrapp“|node" ["tagsid"]=> string(19) "[398,"239",399,400]" ["catesname"]=> string(0) "" ["catesid"]=> string(2) "[]" ["createtime"]=> string(10) "1511400760" ["_id"]=> string(3) "427" } [2]=> array(10) { ["id"]=> string(3) "426" ["text"]=> string(54) "说说css中pt、px、em、rem都扮演了什么角色" ["intro"]=> string(288) "目录 ECharts 异步加载 ECharts 数据可视化在过去几年中取得了巨大进展。开发人员对可视化产品的期望不再是简单的图表创建工具,而是在交互、性能、数据处理等方面有更高的要求。 chart.setOption({ color: [ " ["username"]=> string(12) "zhengqiaoyin" ["tagsname"]=> string(0) "" ["tagsid"]=> string(2) "[]" ["catesname"]=> string(0) "" ["catesid"]=> string(2) "[]" ["createtime"]=> string(10) "1511400640" ["_id"]=> string(3) "426" } [3]=> array(10) { ["id"]=> string(3) "425" ["text"]=> string(83) "深入学习JS执行--创建执行上下文(变量对象,作用域链,this)" ["intro"]=> string(288) "目录 ECharts 异步加载 ECharts 数据可视化在过去几年中取得了巨大进展。开发人员对可视化产品的期望不再是简单的图表创建工具,而是在交互、性能、数据处理等方面有更高的要求。 chart.setOption({ color: [ " ["username"]=> string(7) "Ry-yuan" ["tagsname"]=> string(33) "Javascript|Javascript执行过程" ["tagsid"]=> string(13) "["169","191"]" ["catesname"]=> string(0) "" ["catesid"]=> string(2) "[]" ["createtime"]=> string(10) "1511399901" ["_id"]=> string(3) "425" } [4]=> array(10) { ["id"]=> string(3) "424" ["text"]=> string(30) "C# 排序技术研究与对比" ["intro"]=> string(288) "目录 ECharts 异步加载 ECharts 数据可视化在过去几年中取得了巨大进展。开发人员对可视化产品的期望不再是简单的图表创建工具,而是在交互、性能、数据处理等方面有更高的要求。 chart.setOption({ color: [ " ["username"]=> string(9) "vveiliang" ["tagsname"]=> string(0) "" ["tagsid"]=> string(2) "[]" ["catesname"]=> string(8) ".Net Dev" ["catesid"]=> string(5) "[199]" ["createtime"]=> string(10) "1511399150" ["_id"]=> string(3) "424" } [5]=> array(10) { ["id"]=> string(3) "423" ["text"]=> string(72) "【算法】小白的算法笔记:快速排序算法的编码和优化" ["intro"]=> string(288) "目录 ECharts 异步加载 ECharts 数据可视化在过去几年中取得了巨大进展。开发人员对可视化产品的期望不再是简单的图表创建工具,而是在交互、性能、数据处理等方面有更高的要求。 chart.setOption({ color: [ " ["username"]=> string(9) "penghuwan" ["tagsname"]=> string(6) "算法" ["tagsid"]=> string(7) "["344"]" ["catesname"]=> string(0) "" ["catesid"]=> string(2) "[]" ["createtime"]=> string(10) "1511398109" ["_id"]=> string(3) "423" } [6]=> array(10) { ["id"]=> string(3) "422" ["text"]=> string(64) "JavaScript数据可视化编程学习(二)Flotr2,雷达图" ["intro"]=> string(288) "目录 ECharts 异步加载 ECharts 数据可视化在过去几年中取得了巨大进展。开发人员对可视化产品的期望不再是简单的图表创建工具,而是在交互、性能、数据处理等方面有更高的要求。 chart.setOption({ color: [ " ["username"]=> string(7) "chengxs" ["tagsname"]=> string(28) "数据可视化|前端学习" ["tagsid"]=> string(9) "[396,397]" ["catesname"]=> string(18) "前端基本知识" ["catesid"]=> string(5) "[198]" ["createtime"]=> string(10) "1511397800" ["_id"]=> string(3) "422" } [7]=> array(10) { ["id"]=> string(3) "421" ["text"]=> string(36) "C#表达式目录树(Expression)" ["intro"]=> string(288) "目录 ECharts 异步加载 ECharts 数据可视化在过去几年中取得了巨大进展。开发人员对可视化产品的期望不再是简单的图表创建工具,而是在交互、性能、数据处理等方面有更高的要求。 chart.setOption({ color: [ " ["username"]=> string(4) "wwym" ["tagsname"]=> string(0) "" ["tagsid"]=> string(2) "[]" ["catesname"]=> string(4) ".NET" ["catesid"]=> string(7) "["119"]" ["createtime"]=> string(10) "1511397474" ["_id"]=> string(3) "421" } [8]=> array(10) { ["id"]=> string(3) "420" ["text"]=> string(47) "数据结构 队列_队列实例:事件处理" ["intro"]=> string(288) "目录 ECharts 异步加载 ECharts 数据可视化在过去几年中取得了巨大进展。开发人员对可视化产品的期望不再是简单的图表创建工具,而是在交互、性能、数据处理等方面有更高的要求。 chart.setOption({ color: [ " ["username"]=> string(7) "idreamo" ["tagsname"]=> string(40) "C语言|数据结构|队列|事件处理" ["tagsid"]=> string(23) "["246","247","248",395]" ["catesname"]=> string(12) "数据结构" ["catesid"]=> string(7) "["133"]" ["createtime"]=> string(10) "1511397279" ["_id"]=> string(3) "420" } [9]=> array(10) { ["id"]=> string(3) "419" ["text"]=> string(47) "久等了,博客园官方Android客户端发布" ["intro"]=> string(288) "目录 ECharts 异步加载 ECharts 数据可视化在过去几年中取得了巨大进展。开发人员对可视化产品的期望不再是简单的图表创建工具,而是在交互、性能、数据处理等方面有更高的要求。 chart.setOption({ color: [ " ["username"]=> string(3) "cmt" ["tagsname"]=> string(0) "" ["tagsid"]=> string(2) "[]" ["catesname"]=> string(0) "" ["catesid"]=> string(2) "[]" ["createtime"]=> string(10) "1511396549" ["_id"]=> string(3) "419" } } ["count"]=> int(200) } 222 Rxjava+Retrofit+Okhttp进行网络访问及数据解析 - 爱码网

前言:

在平时项目开发中Okhttp3.x、Rxjava2.x、Retrofit2.x,使用的越来越多了,需要我们不断的去学习别人的优秀开发设计程序,今天简单的了解下

1,创建Android项目(Android studio)导入相关依赖

    implementation 'com.squareup.okhttp3:okhttp:3.11.0'
    implementation 'com.squareup.retrofit2:retrofit:2.4.0'
    implementation 'io.reactivex.rxjava2:rxjava:2.2.5'
    implementation 'io.reactivex.rxjava2:rxandroid:2.1.0'

这里有网友提供的免费测试接口 http://gank.io/api/data/Android/10/1

2,定义接口类

package app.bxvip.com.rxjavaretrofit.imple;

import okhttp3.ResponseBody;
import retrofit2.Call;
import retrofit2.http.GET;
public interface MyApi {
  @GET("api/data/Android/10/1")
  Call<ResponseBody> getAndroidInfo();
    /**
     * 这里使用到了 Okhttp3 和retrofit2,我们通过导入的包就知道
     * 估计会有人对上面的写法表示不理解,接下来我们慢慢理解:
     * @GET 这个表示的是GET请求,想必不用不多说
     * "api/data/Android/10/1"可以理解为接口url, 一般url分为两个部分,前面一部分是不会变化的,就像前面提到的http://gank.io/api/data/Android/10/1这个接口
     * http://gank.io/这个是不会改变的,俗称baseurl,后面的就是接口url部分
     * Call<ResponseBody>是retrofit2中的对象,等会我们就知道他的用处
     */
}

3,发出请求,回调信息

public class MainActivity extends AppCompatActivity implements View.OnClickListener{
    private Button bt_send;
    private TextView tv_result;
    public Retrofit retrofit;
    public  MyApi api;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        bt_send =findViewById(R.id.bt_send);
        tv_result =findViewById(R.id.result);
        bt_send.setOnClickListener(this);
        //实例化相关对象
        initObject();
    }

    private void initObject() {
    	//这里是构建对象,将之前的接口url和baseurl拼接
        retrofit = new Retrofit.Builder().baseUrl("http://gank.io/").build();
        api = retrofit.create(MyApi.class);
        
    }

    @Override
    public void onClick(View view) {
        switch (view.getId()){
            case R.id.bt_send:
                send();
                break;
            default:
                break;
        }
    }

    private void send() {
    //发出请求,并接受回调信息
        Call<ResponseBody> call = api.getAndroidInfo();
        call.enqueue(new Callback<ResponseBody>() {
            @Override
            public void onResponse(Call<ResponseBody> call, Response<ResponseBody> response) {
                Log.i("request return :","success");
                tv_result.setText(response.body().toString());
            }

            @Override
            public void onFailure(Call<ResponseBody> call, Throwable t) {
                Log.i("request return :","faild");
                tv_result.setText(t.getMessage());
            }
        });
    }
}

注意需要添加网络权限

Rxjava+Retrofit+Okhttp进行网络访问及数据解析

 但是这样的话,看起来是不是结果太乱了,只知道返回了数据,乱七八糟的什么也看不出来,有没有办法让数据更工整点呢,GSON是一个神器

4,Rxjava 和 Retrofit的结合

//这里提供两个接口一个是天气接口,一个是豆瓣的接口
https://www.sojson.com/open/api/weather/json.shtml?city=广州
https://api.douban.com/v2/book/search?q=金瓶梅

1,通过GsonFormat插件创建两个对象WeatherBean和BookBean 

Rxjava+Retrofit+Okhttp进行网络访问及数据解析

 2,编写访问的接口程序

	//接着上面的 MyApi后面继续写,这里是访问程序接口
    @GET("open/api/weater/json.shtml")
    Observable<WeatherBean> getWeather(@Query("city")String city);
	//@Query("city")String city是需要传递的参数用问好隔开
    @GET("book/search")
    Observable<BookBean> getBook(@Query("a")String name);

3,通过订阅连接观察者和被观察者

// Retrofit 通过okhttp访问接口
  Retrofit retrofit = new Retrofit.Builder()
                .baseUrl("http://t.weather.sojson.com/api/weather/city/")
                .client(getOkHttpClient())
                .addConverterFactory(GsonConverterFactory.create())
                .addCallAdapterFactory(RxJava2CallAdapterFactory.create())
                .build();
        api = retrofit.create(MyApi.class);
 public OkHttpClient getOkHttpClient() {
        if (okHttpClient==null){
            okHttpClient = new OkHttpClient.Builder()
                    .retryOnConnectionFailure(true)
                    .connectTimeout(3000, TimeUnit.SECONDS)
                    .addInterceptor(new Interceptor() {
                        @Override
                        public okhttp3.Response intercept(Chain chain) throws IOException {
                            Request request = chain.request()
                                    .newBuilder()
                                    //删除原始的请求头
                                    .removeHeader("User-Agent")
                                    //添加新的 User-Agent
                                    .addHeader("User-Agent","Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:0.9.4)")
                                    .build();
                            return chain.proceed(request);
                        }
                    })
                    .build();

        }
        return okHttpClient;
    }
GsonConverterFactory
RxJava2CallAdapterFactory
//需要导入两个依赖
    implementation 'com.squareup.retrofit2:converter-gson:2.4.0'
    implementation 'com.squareup.retrofit2:adapter-rxjava2:2.4.0'

4,通过Rxjava将访问到的结果发射出来

 private void sendWeather(){
        //返回的是一个Obserable对象
        api.getWeather("广州").subscribeOn(Schedulers.io())
                .observeOn(AndroidSchedulers.mainThread())
                .subscribe(new Observer<WeatherBean>() {
                    @Override
                    public void onSubscribe(Disposable d) {

                    }

                    @Override
                    public void onNext(WeatherBean weatherBean) {
                        Log.i("hb","ad"+weatherBean.getCity());
                        if (weatherBean==null){
                            Log.i("hb",weatherBean.getCity());
                        }
                        //这里我们可以使用回调的方式,发给其他的类
                        //如 listern.send(weatherBean)
                    }

                    @Override
                    public void onError(Throwable e) {
                        Log.i("hb",e.getMessage());
                    }

                    @Override
                    public void onComplete() {
                        Log.i("hb","sdf");
                    }
                });
    }
原文地址:https://juejin.cn/post/7135072705295941640

相关文章: