Retrofit + Rxjava 获取网页的Json数据

        Retrofit 一推出就受到了广大人民的热爱,作为一个学习的人,也要跟上时代,学习新的技术,了解更多的知识,带着这样的目标,开始了我的学习之路,第一步肯定就是百度,看看别人的博客,从中挑取适合自己的进行学习,以下是我看到的一个不错的博客,推荐给大家,当然,也可以自己百度学习:

这是一份很详细的 Retrofit 2.0 使用教程(含实例讲解)Retrofit详细讲解,个人认为很不错。

Android:手把手带你入门神秘的 Rxjava  RXjava详细讲解

     在了解了这两个库的使用之后,开始了我们的第一个简单的获取网页JSON数据。在这里推荐一个获取数据API的一个网站,本人也只是用于获取网站的JSON数据测试,当然有实力的话也可以自己写一个JSON数据的文件。这里推荐的网址是https://gank.io/api,里面给我们详细的介绍了一些API的接口以及使用,我就不阐述了,前期工作准备好之后就开始获取数据的工作。

第一:新建一个Android 项目,名字自取,新建完成之后,添加好需要使用的库,

//retrofit
implementation 'com.squareup.retrofit2:retrofit:2.1.0'
implementation 'com.squareup.retrofit2:converter-gson:2.1.0'
implementation 'com.squareup.retrofit2:adapter-rxjava:2.1.0'
implementation 'com.squareup.okhttp3:logging-interceptor:3.5.0'
//rxJava
implementation 'io.reactivex:rxandroid:1.2.1'
implementation 'com.ogaclejapan:rxbinding:1.2.0'
implementation 'com.github.VictorAlbertos.RxCache:core:1.4.6'

implementation 'androidx.recyclerview:recyclerview:1.1.0'
// Glide
implementation 'com.github.bumptech.glide:glide:4.10.0'
annotationProcessor 'com.github.bumptech.glide:compiler:4.10.0'

第二:添加需要的权限

<uses-permission android:name="android.permission.INTERNET" />

第三:使用 Retrofit + RXjava实现JSon数据的获取(以https://gank.io/api/v2/data/category/GanHuo/type/Android/page/1/count/45的网页JSON数据为例)

(1)定义网络请求返回的实体类,在对于那些不熟悉JSOn数据结构的人,提供你们一个简单的方法,快速获取一个实体类,点击File ----> Settings ---->Plugins  ,搜索GsonFormat插件,下载完成安装,安装完成之后需要重启Android Studio ,重启之后就可以使用了。

        快速生成实体类的方法:

                  1.新建一个实体类PhotoBean ;

                  2.点击右键在弹框中选择 Generate属性------->GsonFormat就可以一键生成JSon实体类。

                     Retrofit + Rxjava 获取网页的Json数据

(2)定义需要访问的网页的BASE_URL:

public static final String BASE_URL = "https://gank.io/";

(3)定义一个拼接一个BASE_URL然后进行网络请求的接口类:

public interface RetrofitData {
    @GET("api/v2/data/category/Girl/type/Girl/page/{page}/count/{number}")
    Observable<PhotoBean> getData(@Path("page") int page,@Path("number") int number);
}

(4)定义一个Retrofit 辅助类,创建Retrofit实例

public class RetrofitHelper {

    public static OkHttpClient okHttpClient;
    public static Retrofit retrofit;

    public static OkHttpClient getOkHttpClientInstance(){
        if (okHttpClient == null){
            okHttpClient = new OkHttpClient.Builder()
                    .connectTimeout(10, TimeUnit.SECONDS)
                    .writeTimeout(10, TimeUnit.SECONDS)
                    .readTimeout(10, TimeUnit.SECONDS)
                    .build();
        }
        return okHttpClient;
    }

    public static Retrofit getRetrofitInstance(){
        if (retrofit == null){
            if (okHttpClient == null){
                getOkHttpClientInstance();
            }
            retrofit = new Retrofit.Builder()
                    .baseUrl(Contants.BASE_URL)
                    .addCallAdapterFactory(RxJavaCallAdapterFactory.create())
                    .addConverterFactory(GsonConverterFactory.create())
                    .client(okHttpClient)
                    .build();
        }
        return  retrofit;
    }

(5)Retrofit +RXjava结合使用;

private void RequestPhotoData() {
    final Retrofit retrofit = RetrofitHelper.getRetrofitInstance();
    RetrofitData retrofitData = retrofit.create(RetrofitData.class);
    Observable<PhotoBean> observable = retrofitData.getData(1,45);
    observable.subscribeOn(Schedulers.io())
            .subscribeOn(Schedulers.newThread())
            .observeOn(AndroidSchedulers.mainThread())
            .subscribe(new Observer<PhotoBean>() {
                @Override
                public void onCompleted() {
                    Log.i("wj","--------onCompleted-----------");
                }

                @Override
                public void onError(Throwable e) {
                   e.printStackTrace();
                }

                @Override
                public void onNext(PhotoBean photoBean) {
                    Log.i("wj","--------onNext-----------"+photoBean);
                    list = photoBean.getData();
                    refashUI();

                }
            });
}

(6)将获取到的数据用列表的方式显现出来:

LinearLayoutManager linearLayoutManager = new LinearLayoutManager(context);
recyclerView.setLayoutManager(linearLayoutManager);
myAdapter = new MyAdapter(context,list);
recyclerView.setAdapter(myAdapter);

至此,Retrofit + RxJava 结合获取JSON数据完毕。github地址:https://github.com/sure13/RetrofitTest