文章目录

步骤攻略:

  1. 添加Retrofit2和RxJava2库的依赖:
  2. 创建接受服务器返回数据的类(用于处理数据的类)
  3. 创建用于描述网络请求的接口,并且配置网络请求参数
  4. 创建Retrofit实例
  5. 创建网络请求的接口实例
  6. 发送网络请求(同步,异步)
  7. 处理服务器返回的数据
    ##代码解析:
    ①添加网络权限和依赖,manifest中添加网络请求权限,app下的buildgradle文件添加如下依赖
   androidTestImplementation 'com.android.support.test.espresso:espresso-core:3.0.1'
//  ①  RxJava1.0+Retrofit2的依赖
//    compile 'io.reactivex:rxjava:1.1.0'
//    compile 'io.reactivex:rxandroid:1.1.0'
    //  ①  RxJava2.0+Retrofit2的依赖
    compile 'io.reactivex.rxjava2:rxjava:2.1.0'
    compile 'io.reactivex.rxjava2:rxandroid:2.0.1'
    compile 'com.amitshekhar.android:rx2-android-networking:1.0.0'//支持把json解析成Java对象

    implementation 'com.squareup.retrofit2:retrofit:2.3.0'
    implementation 'com.squareup.retrofit2:converter-gson:2.3.0'
    implementation 'com.squareup.retrofit2:adapter-rxjava2:2.3.0'
//    以上三个版本号要保持一致
    implementation 'com.jakewharton:butterknife:8.8.1'
    annotationProcessor 'com.jakewharton:butterknife-compiler:8.8.1'
    implementation 'com.google.code.gson:gson:2.8.2'

②实体类,用于接受数据的实体类(略)
③创建用于描述网络请求的接口,并且配置网络请求参数
只用Retrofit2不用RxJava的接口:

package com.ytf.ppg.rxjava1demo.retrofit2;

import com.ytf.ppg.rxjava1demo.bean.MovieEntity;

import retrofit2.Call;
import retrofit2.http.GET;
import retrofit2.http.Query;

/**
 * Created by ppg on 2018/3/12.
 * ③网络请求接口,配置网络请求的参数
 * 当拥有该实例的对象时会调用call方法
 * @Query GET方法查询参数,体现在URL中,相当于URL中?后的k-v键值对,url=“******?start=start&count=count”
 */

public interface MoviesService {
    @GET("top250")
    Call<MovieEntity> getTopMovie(@Query("start") int start,@Query("count") int count);
}

使用RxJava的接口:

package com.ytf.ppg.rxjava1demo.retrofit2;

import com.ytf.ppg.rxjava1demo.bean.MovieEntity;


import io.reactivex.Observable;
import retrofit2.http.GET;
import retrofit2.http.Query;

/**
 * Created by ppg on 2018/3/12.
 * ③网络请求接口,配置网络请求的参数
 * 当拥有该实例的对象时会调用call方法
 * @Query GET方法查询参数,体现在URL中,相当于URL中?后的k-v键值对,url=“******?start=start&count=count”
 */

public interface MoviesServiceRxJava {

    @GET("top250")Observable<MovieEntity> getMovies(@Query("start") int start, @Query("count") int count);
}

④acvitity中实现:

package com.ytf.ppg.rxjava1demo;

import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.widget.Button;
import android.widget.TextView;
import android.widget.Toast;

import com.ytf.ppg.rxjava1demo.bean.MovieEntity;
import com.ytf.ppg.rxjava1demo.retrofit2.MoviesService;
import com.ytf.ppg.rxjava1demo.retrofit2.MoviesServiceRxJava;

import org.reactivestreams.Subscriber;
import org.reactivestreams.Subscription;

import butterknife.BindView;
import butterknife.ButterKnife;
import butterknife.OnClick;

import io.reactivex.Observer;
import io.reactivex.android.schedulers.AndroidSchedulers;
import io.reactivex.disposables.Disposable;
import retrofit2.Call;
import retrofit2.Callback;
import retrofit2.Response;
import retrofit2.Retrofit;
import retrofit2.adapter.rxjava2.RxJava2CallAdapterFactory;
import retrofit2.converter.gson.GsonConverterFactory;


public class MainActivity extends AppCompatActivity {

    @BindView(R.id.mBtn_click)
    Button mBtn_click;
    @BindView(R.id.tv_mTv_content)
    TextView tv_mTv_content;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        ButterKnife.bind(this);
    }

    @OnClick(R.id.mBtn_click)
    public void onClick(){
//        getMovies();
        getMoviewByRxJava();
    }

    /**
     * 只用Retrofit2进行网络请求的方法
     * (未封装,原生态)
     */
    private void getMovies() {
        String baseUrl = "https://api.douban.com/v2/movie/";
//      ④  创建Retrofit2的实例
        Retrofit retrofit=new Retrofit.Builder()
                .baseUrl(baseUrl)
                .addConverterFactory(GsonConverterFactory.create())
                .build();
//       ⑤ 创建网络请求接口MoviesService的实例,并在接口中配置网络请求参数
        MoviesService moviesService=retrofit.create(MoviesService.class);
//        ⑥发送网络请求
        Call<MovieEntity> call=moviesService.getTopMovie(0,10);
        call.enqueue(new Callback<MovieEntity>() {
            @Override
            public void onResponse(Call<MovieEntity> call, Response<MovieEntity> response) {
                tv_mTv_content.setText(response.toString());
            }

            @Override
            public void onFailure(Call<MovieEntity> call, Throwable t) {
                tv_mTv_content.setText(t.getMessage());
            }
        });

    }

    /**
     * 结合RxJava进行网络请求
     */
    private void getMoviewByRxJava() {
        String baseUrl = "https://api.douban.com/v2/movie/";
        //      ④  创建Retrofit2的实例
        Retrofit retrofit=new Retrofit.Builder()
                .baseUrl(baseUrl)
                .addConverterFactory(GsonConverterFactory.create())
                .addCallAdapterFactory(RxJava2CallAdapterFactory.create())
                .build();
//       ⑤ 创建网络请求接口MoviesService的实例,并在接口中配置网络请求参数
        MoviesServiceRxJava moviesServiceRxJava=retrofit.create(MoviesServiceRxJava.class);
        moviesServiceRxJava.getMovies(0,10)
                .subscribeOn(io.reactivex.schedulers.Schedulers.io())
                .observeOn(AndroidSchedulers.mainThread())
                .subscribe(new Observer<MovieEntity>() {
                    @Override
                    public void onSubscribe(Disposable d) {
                       Toast.makeText(getApplicationContext(),"执行了onSubscribe()方法",Toast.LENGTH_SHORT).show();
                    }

                    @Override
                    public void onNext(MovieEntity movieEntity) {
                        tv_mTv_content.setText( movieEntity.toString());
                        Toast.makeText(getApplicationContext(),"执行了onNext()方法",Toast.LENGTH_SHORT).show();
                    }

                    @Override
                    public void onError(Throwable e) {
                        tv_mTv_content.setText(e.getMessage().toString());
                        Toast.makeText(getApplicationContext(),"执行了onError()方法",Toast.LENGTH_SHORT).show();
                    }

                    @Override
                    public void onComplete() {
                        tv_mTv_content.setText("完成!");
                        Toast.makeText(getApplicationContext(),"执行了onComplete()方法",Toast.LENGTH_SHORT).show();
                    }
                });



    }
}

GitHub地址:https://github.com/yangtianfu2018/Retrofit2RxJava2ButterKnife
附:RxJava执行原理图
Retrofit2+RxJava2+ButterKnife框架搭建步骤_Android开发