只用Retrofit
首先项目中Gradule中导入 依赖
compile 'io.reactivex:rxjava:1.1.0'
compile 'io.reactivex:rxandroid:1.1.0'
compile 'com.squareup.retrofit2:retrofit:2.0.0-beta4'
compile 'com.squareup.retrofit2:converter-gson:2.0.0-beta4'
compile 'com.squareup.retrofit2:adapter-rxjava:2.0.0-beta4'
compile 'com.google.code.gson:gson:2.6.2'
相关的联网权限不要忘了
然后我们请求这个网址:
https://api.douban.com/v2/movie/top250?start=0&count=10
首先,在onCreate()方法中 初始化代码:
mRetrofit = new Retrofit.Builder()
.baseUrl(UrlConstant.baseUrl)
.addConverterFactory(GsonConverterFactory.create())
.build();
根据上面的网址, 封装一个Entity, 暂命名为MoviceEntity,
然后我们创建一个接口,取名为MoviceService, 代码如下:
public interface MoviceService {
//top250 为baseUrl后面的, 而下方的Query的两个参数为?后面拼接的内容,在创建MoviceService的时候传入具体的值
@GET("top250")
Call<MoviceEntity> getTop(@Query("start") int start,@Query("count") int count);
}
回到Activity中,我们来写请求网络的代码,
package com.example.retrofitdemo;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.view.View;
import android.widget.Button;
import android.widget.LinearLayout;
import android.widget.TextView;
import android.widget.Toast;
import com.example.retrofitdemo.bean.MoviceEntity;
import butterknife.Bind;
import butterknife.ButterKnife;
import retrofit2.Call;
import retrofit2.Callback;
import retrofit2.Response;
import retrofit2.Retrofit;
import retrofit2.converter.gson.GsonConverterFactory;
/**
* https://api.douban.com/v2/movie/top250?start=0&count=10
*/
public class MainActivity extends AppCompatActivity implements View.OnClickListener {
@Bind(R.id.tv)
TextView mTv;
@Bind(R.id.activity_main)
LinearLayout mActivityMain;
@Bind(R.id.bt)
Button mButton;
private Retrofit mRetrofit;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
ButterKnife.bind(this);
mButton.setOnClickListener(this);
mRetrofit = new Retrofit.Builder()
.baseUrl(UrlConstant.baseUrl)
.addConverterFactory(GsonConverterFactory.create())
.build();
}
@Override
public void onClick(View view) {
getMovie();
}
private void getMovie() {
//MoviceService接口对象 是通过mRetrofit create()
MoviceService moviceService = mRetrofit.create(MoviceService.class);
//传入具体的值,生成call对象
Call<MoviceEntity> moviceEntityCall = moviceService.getTop(0, 10);
moviceEntityCall.enqueue(new Callback<MoviceEntity>() {
@Override
public void onResponse(Call<MoviceEntity> call, Response<MoviceEntity> response) {
String str = response.body().toString();
mTv.setText(str);
}
@Override
public void onFailure(Call<MoviceEntity> call, Throwable t) {
Toast.makeText(MainActivity.this,t.toString(),Toast.LENGTH_LONG).show();
}
});
}
}
以上为没有经过封装的,原生态的代码, 没有使用到RxJava 但是如果我们的Http返回的数据是统一的格式,例如:
{
"resultCode": 0,
"resultMessage" : "成功",
"data" : {}
}
而且, 我的ProgressDialog的show() 在哪里调用呢? 在错误请求中 也想集中处理掉重复的代码
添加RxJava
在Gradule中添加 :
compile 'com.squareup.retrofit2:adapter-rxjava:2.0.0-beta4'
然后在创建Retrofit中 链式多添加一条.addCallAdapterFactory(RxJavaCallAdapterFactory.create())
这样 MoviceService接口中 我们返回值就不是一个Call了 而是一个Observable, 重新定义MoviceService接口public interface MovieService {
@GET("top250")
Observable<MovieEntity> getTopMovie(@Query("start") int start, @Query("count") int count);
}
MainActivity中的联网请求代码:
package com.example.retrofitdemo;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.view.View;
import android.widget.Button;
import android.widget.LinearLayout;
import android.widget.TextView;
import android.widget.Toast;
import com.example.retrofitdemo.bean.MoviceEntity;
import butterknife.Bind;
import butterknife.ButterKnife;
import retrofit2.Retrofit;
import retrofit2.adapter.rxjava.RxJavaCallAdapterFactory;
import retrofit2.converter.gson.GsonConverterFactory;
import rx.Subscriber;
import rx.android.schedulers.AndroidSchedulers;
import rx.schedulers.Schedulers;
/**
* https://api.douban.com/v2/movie/top250?start=0&count=10
*/
public class MainActivity extends AppCompatActivity implements View.OnClickListener {
@Bind(R.id.tv)
TextView mTv;
@Bind(R.id.activity_main)
LinearLayout mActivityMain;
@Bind(R.id.bt)
Button mButton;
private Retrofit mRetrofit;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
ButterKnife.bind(this);
mButton.setOnClickListener(this);
mRetrofit = new Retrofit.Builder()
.baseUrl(UrlConstant.baseUrl)
.addConverterFactory(GsonConverterFactory.create())
.addCallAdapterFactory(RxJavaCallAdapterFactory.create()) //添加RxJavaCallAdapterFactory
.build();
}
@Override
public void onClick(View view) {
getMovie();
}
private void getMovie() {
//MoviceService接口对象 是通过mRetrofit create()
MoviceService moviceService = mRetrofit.create(MoviceService.class);
//传入具体的值,生成call对象
// Call<MoviceEntity> moviceEntityCall = moviceService.getTop(0, 10);
// moviceEntityCall.enqueue(new Callback<MoviceEntity>() {
// @Override
// public void onResponse(Call<MoviceEntity> call, Response<MoviceEntity> response) {
// String str = response.body().toString();
// mTv.setText(str);
// }
//
// @Override
// public void onFailure(Call<MoviceEntity> call, Throwable t) {
// Toast.makeText(MainActivity.this,t.toString(),Toast.LENGTH_LONG).show();
// }
// });
//添加RxJava
moviceService.getTop(0,10)
.subscribeOn(Schedulers.io()) //在线程订阅
.observeOn(AndroidSchedulers.mainThread()) //在主线程观察
.subscribe(new Subscriber<MoviceEntity>() {
@Override
public void onCompleted() {
Toast.makeText(MainActivity.this, "Get Top Movie Completed", Toast.LENGTH_SHORT).show();
}
@Override
public void onError(Throwable e) {
}
@Override
public void onNext(MoviceEntity moviceEntity) {
String str = moviceEntity.toString();
mTv.setText(str);
}
});
}
}
这就完成了Retrofit和RxJava的结合, 接下来我们把创建Retrofit的过程封装一下,然后希望Activity创建Subscriber对象进来
将请求过程进行封装
直接贴 封装的HttpMethod类的代码:
package com.example.retrofitdemo;
import com.example.retrofitdemo.bean.MoviceEntity;
import java.util.concurrent.TimeUnit;
import okhttp3.OkHttpClient;
import retrofit2.Retrofit;
import retrofit2.adapter.rxjava.RxJavaCallAdapterFactory;
import retrofit2.converter.gson.GsonConverterFactory;
import rx.Subscriber;
import rx.android.schedulers.AndroidSchedulers;
import rx.schedulers.Schedulers;
/**
* Created by zmybi on 2017/1/13.
*
* 将请求进行封装的类
*/
public class HttpMethod {
private String baseUrl = UrlConstant.baseUrl;
private Retrofit mRetrofit;
private MoviceService mMoviceService;
//私有构造方法
private HttpMethod() {
//手动设置一个OkHttpClient并设置超时时间
OkHttpClient.Builder httpClient = new OkHttpClient.Builder();
httpClient.connectTimeout(2, TimeUnit.SECONDS); //设置2秒超时
mRetrofit = new Retrofit.Builder()
.baseUrl(baseUrl)
.addConverterFactory(GsonConverterFactory.create())
.addCallAdapterFactory(RxJavaCallAdapterFactory.create())
.build();
mMoviceService = mRetrofit.create(MoviceService.class);
}
//对外提供公共的获得方法
public static HttpMethod getInstance() {
HttpMethod httpMethod = new HttpMethod();
return httpMethod;
}
/**
* 其实也是对接口中的getTop()方法进行了一次包装
* 用于获取豆瓣电影Top250的数据
* @param subscriber 由调用者 传递过来的观察者对象
* @param start url后面get请求的参数
* @param count 同start
*/
public void getTopMovice(Subscriber<MoviceEntity> subscriber, int start, int count) {
mMoviceService.getTop(start,count)
.subscribeOn(Schedulers.io()) //在子线程中观察
.unsubscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(subscriber);
}
}
MainActivity中的代码瘦身了很多:package com.example.retrofitdemo;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.view.View;
import android.widget.Button;
import android.widget.LinearLayout;
import android.widget.TextView;
import android.widget.Toast;
import com.example.retrofitdemo.bean.MoviceEntity;
import butterknife.Bind;
import butterknife.ButterKnife;
import rx.Subscriber;
/**
* https://api.douban.com/v2/movie/top250?start=0&count=10
*/
public class MainActivity extends AppCompatActivity implements View.OnClickListener {
@Bind(R.id.tv)
TextView mTv;
@Bind(R.id.activity_main)
LinearLayout mActivityMain;
@Bind(R.id.bt)
Button mButton;
// private Retrofit mRetrofit;
private HttpMethod mHttpMethodInstance;
private Subscriber<MoviceEntity> mSubscriber;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
ButterKnife.bind(this);
mButton.setOnClickListener(this);
// mRetrofit = new Retrofit.Builder()
// .baseUrl(UrlConstant.baseUrl)
// .addConverterFactory(GsonConverterFactory.create())
// .addCallAdapterFactory(RxJavaCallAdapterFactory.create()) //添加RxJavaCallAdapterFactory
// .build();
mHttpMethodInstance = HttpMethod.getInstance();
}
@Override
public void onClick(View view) {
getMovie();
}
private void getMovie() {
//MoviceService接口对象 是通过mRetrofit create()
// MoviceService moviceService = mRetrofit.create(MoviceService.class);
// 一:传入具体的值,生成call对象
// Call<MoviceEntity> moviceEntityCall = moviceService.getTop(0, 10);
// moviceEntityCall.enqueue(new Callback<MoviceEntity>() {
// @Override
// public void onResponse(Call<MoviceEntity> call, Response<MoviceEntity> response) {
// String str = response.body().toString();
// mTv.setText(str);
// }
//
// @Override
// public void onFailure(Call<MoviceEntity> call, Throwable t) {
// Toast.makeText(MainActivity.this,t.toString(),Toast.LENGTH_LONG).show();
// }
// });
//二 :添加RxJava
// moviceService.getTop(0,10)
// .subscribeOn(Schedulers.io()) //在线程订阅
// .observeOn(AndroidSchedulers.mainThread()) //在主线程观察
// .subscribe(new Subscriber<MoviceEntity>() {
// @Override
// public void onCompleted() {
// Toast.makeText(MainActivity.this, "Get Top Movie Completed", Toast.LENGTH_SHORT).show();
// }
//
// @Override
// public void onError(Throwable e) {
//
// }
//
// @Override
// public void onNext(MoviceEntity moviceEntity) {
// String str = moviceEntity.toString();
// mTv.setText(str);
// }
// });
//三: 对请求体 进行封装
mSubscriber = new Subscriber<MoviceEntity>() {
@Override
public void onCompleted() {
Toast.makeText(MainActivity.this, "Get Top Movie Completed", Toast.LENGTH_SHORT).show();
}
@Override
public void onError(Throwable e) {
}
@Override
public void onNext(MoviceEntity moviceEntity) {
String str = moviceEntity.toString();
mTv.setText(str);
}
};
mHttpMethodInstance.getTopMovice(mSubscriber,0,10);
}
}