• 利用Retrofit, RxJava获取网络内容


    Retrofit & RxJava

    关于如何使用Retrofit和RxJava请阅读参考中的两篇文章.

    Retrofit处理数据

    Retrofit是在什么时候处理从网络中获取到的json数据的呢? 我从几个使用了Retrofit的项目源代码寻找了半天, 也没有找到处理json的相关代码. 后来才发现, Retrofit中使用.addConverterFactory(GsonConverterFactory.create())其实就是自动添加了json解析, 它会将json数据直接转换为java类(即Pojo).

    convertToPojo可以根据json的内容自动生成Pojo类.

    以豆瓣api为例

    json数据格式

    豆瓣正在热映的json数据格式大致如下:

    DoubanService.java
    
    interface DoubanService {
        @GET("/v2/movie/in_theaters")
        Call<Douban> getList();
    }

    pojo类

    public class Douban {
        @SerializedName(value = "subjects")
        private List<Subjects> subjects;
    
        ...Getter and Setter..
    }
    
    public class Subjects {
        private String id;
        private String title;
        private Rating rating;
    }
    public class Rating {
        private String min;
        private String max;
        private String stars;
    
        ...Getter and Setter..
    }

    处理并显示数据

    public class DoubanRun extends Thread {
        @Override
        public void run() {
            super.run();
            Retrofit retrofit=new Retrofit.Builder()
                    .baseUrl("https://api.douban.com")
                    .addConverterFactory(GsonConverterFactory.create())
                    .build();
            DoubanService douban=retrofit.create(DoubanService.class);
            Call<Douban> call=douban.getList();
    
            try {
                Douban d=call.execute().body();
                for (Subjects l:d.getSubjects()){
                     Log.i("TAGGGG",l.getId()+" "+l.getTitle());
                }
            } catch (IOException e) {
                e.printStackTrace();
                Log.i("TAGGGG","ff");
            }
        }
    }

    结果

    26630781 我不是潘金莲
    25726614 神奇动物在哪里
    25793398 海洋奇缘
    26365631 冲天火
    26596486 名侦探柯南:纯黑的恶梦
    3025375 奇异博士
    26370431 夏威夷之恋
    26673217 我是处女座
    26696875 最萌身高差
    25983044 比利·林恩的中场战事
    22266320 深海浩劫
    26876505 怨灵地下室
    25921812 驴得水
    26598021 航海王之黄
    ...

    配合RxJava

    DoubanService.java改为:

    interface DoubanService {
        @GET("/v2/movie/in_theaters")
        Observable<Douban> getList();
    }

    DoubanRun改为:

    public class DoubanRun extends Thread {
    
        @Override
        public void run() {
            super.run();
    
            Retrofit retrofit=new Retrofit.Builder()
                    .baseUrl("https://api.douban.com")
                    .addConverterFactory(GsonConverterFactory.create())
                    //
                    .addCallAdapterFactory(RxJavaCallAdapterFactory.create())
    
                    .build();
    
            DoubanService doubanService=retrofit.create(DoubanService.class);
    
            doubanService.getList()
                    .subscribeOn(Schedulers.io())
                    .observeOn(AndroidSchedulers.mainThread())
                    .subscribe(new Subscriber<Douban>() {
                        @Override
                        public void onCompleted() {
    
                        }
    
                        @Override
                        public void onError(Throwable e) {
    
                        }
    
                        @Override
                        public void onNext(Douban douban) {
                            for (Subjects l:douban.getSubjects()){
                                Log.i("TAGGGG",l.getId()+" "+l.getTitle());
    
                            }
                        }
                    });
        }
    }
    

    注意点

    1. 出现Expected BEGIN_ARRAY but was BEGIN_OBJECT at或者pojo类中对应的变量的类型不对. 比如 如果在Subjects类中将rating设为String. 就会有Expected String but was BEGIN_OBJECT at...错误.

    参考文章

    1. 给 Android 开发者的 RxJava 详解
      archive.org备份页面
    2. RxJava 与 Retrofit 结合的最佳实践
      archive.org备份页面
  • 相关阅读:
    测试文件报告
    Bug Variations
    阶段一 问答题2
    阶段一 问答题1
    HeapSort
    Git系列 (01):git clone 速度太慢解决方法
    ES6系列 (03):链判断运算符和Null 判断运算符
    ES6系列 (02):解构赋值
    ES6系列 (01):箭头函数this指向问题
    我忘却了所有,抛却了信仰,舍弃了轮回,只为,那曾在佛前哭泣的玫瑰,早已失去旧日的光泽。
  • 原文地址:https://www.cnblogs.com/fei-hsueh/p/6106292.html
Copyright © 2020-2023  润新知