文章目录
步骤攻略:
- 添加Retrofit2和RxJava2库的依赖:
- 创建接受服务器返回数据的类(用于处理数据的类)
- 创建用于描述网络请求的接口,并且配置网络请求参数
- 创建Retrofit实例
- 创建网络请求的接口实例
- 发送网络请求(同步,异步)
- 处理服务器返回的数据
##代码解析:
①添加网络权限和依赖,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执行原理图