github地址:https://github.com/hnhzy/RxRetrofitProject
接着Android retrofit基本使用及原理探究RxJava+Retrofit的实现
简单实现
1、导入依赖库
//retrofit2
implementation 'com.squareup.retrofit2:retrofit:2.5.0'
implementation 'com.squareup.retrofit2:converter-gson:2.5.0'
implementation 'com.squareup.retrofit2:adapter-rxjava2:2.5.0'
// 用Gson解析json的转换器
implementation 'com.google.code.gson:gson:2.8.5'
//rxjava2
implementation 'io.reactivex.rxjava2:rxandroid:2.1.0'
implementation 'io.reactivex.rxjava2:rxjava:2.2.5'
2、创建ApiService
/**
* Created by hzy on 2019/1/10
**/
public interface ApiService {
/**
* 获取知识体系数据
* @param page
* @param cid
* @return
*/
@GET("article/list/{page}/json")
Observable<KnowledgeSystem> getKnowledgeSystem(@Path("page") int page, @Query("cid") int cid);
}
public class Urls {
public static final String BASIC_URL = "http://www.wanandroid.com/"; //鸿洋玩安卓网站
}
3、创建RxSchedulers
/**
* Created by hzy on 2019/1/10
* 线程调度
**/
public class RxSchedulers {
final static ObservableTransformer Stf = new ObservableTransformer() {
@Override
public ObservableSource apply(@NonNull Observable upstream) {
return upstream.subscribeOn(Schedulers.newThread())
.observeOn(AndroidSchedulers.mainThread());
}
};
static <T> ObservableTransformer<T, T> applySchedulers() {
return Stf;
}
@SuppressWarnings("unchecked")
public static <T> ObservableTransformer<T, T> io_main() {
return (ObservableTransformer<T, T>) applySchedulers();
}
}
4、创建Retrofit获取数据,并以TextView显示
public class MainActivity extends AppCompatActivity {
public static final String TAG = "MainActivity";
/**
* Hello World!
*/
private TextView mTvHello;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mTvHello = (TextView) findViewById(R.id.tv_hello);
//1、创建retrofit
Retrofit retrofit = new Retrofit.Builder()
.baseUrl(Urls.BASIC_URL)
//添加转换器Converter(将 json 转为 JavaBean):
.addConverterFactory(GsonConverterFactory.create())
//创建 Retrofit 的时候添加如下代码:
.addCallAdapterFactory(RxJava2CallAdapterFactory.create())
.build();
//2、用retrofit加工出对应的接口实例对象
ApiService api = retrofit.create(ApiService.class);
//3、获取数据并更新UI--再也不需要使用handler或者runOnUiThread了
api.getKnowledgeSystem(1, 60)
.compose(RxSchedulers.<KnowledgeSystem>io_main())
.subscribe(new Consumer<KnowledgeSystem>() {
@Override
public void accept(KnowledgeSystem knowledgeSystem) throws Exception {
Log.e(TAG, "KnowledgeSystem--" + knowledgeSystem.toString());
mTvHello.setText(knowledgeSystem.toString());
}
}, new Consumer<Throwable>() {
@Override
public void accept(Throwable throwable) throws Exception {
Log.e(TAG, "Throwable--" + throwable.toString());
}
});
}
}
简单封装
1、okhttp、retrofit封装
/**
* Created by hzy on 2019/1/10
* 网络请求
**/
public class HttpManager {
private static final String BASE_URL = "http://www.wanandroid.com/";
private Retrofit mRetrofit;
private HashMap<Class, Retrofit> mServiceHashMap = new HashMap<>();
public HttpManager() {
// init okhttp 3 logger
HttpLoggingInterceptor logInterceptor = new HttpLoggingInterceptor();
logInterceptor.setLevel(HttpLoggingInterceptor.Level.NONE);
// int okhttp
OkHttpClient client = new OkHttpClient.Builder()
.retryOnConnectionFailure(true)
.connectTimeout(15, TimeUnit.SECONDS)
.readTimeout(45, TimeUnit.SECONDS)
.writeTimeout(55, TimeUnit.SECONDS)
.addInterceptor(logInterceptor)
.build();
// int retrofit
mRetrofit = new Retrofit.Builder()
.baseUrl(BASE_URL)
.client(client)
.addConverterFactory(GsonConverterFactory.create())
.addCallAdapterFactory(RxJava2CallAdapterFactory.create())
.addConverterFactory(StringConverterFactory.create())
.build();
mServiceHashMap.put(ApiService.class, mRetrofit);
}
public <T> T getService(Class<T> clz) {
Retrofit retrofit = mServiceHashMap.get(clz);
if (retrofit != null) {
T service = retrofit.create(clz);
return service;
} else {
return null;
}
}
}
2、ApiService
/**
* Created by hzy on 2019/1/10
* ApiService
**/
public interface ApiService {
/**
* 获取知识体系数据
* @param page
* @param cid
* @return
*/
@GET("article/list/{page}/json")
Observable<KnowledgeSystem> getKnowledgeSystem(@Path("page") int page, @Query("cid") int cid);
}
3、通过App获取apiService
/**
* Created by hzy on 2019/1/14
**/
public class App extends Application {
private static App mInstance;
private HttpManager mHttpManager = null;
@Override
public void onCreate() {
super.onCreate();
mInstance=this;
mHttpManager = new HttpManager();
}
public static <T> T apiService(Class<T> clz) {
return getInstance().mHttpManager.getService(clz);
}
public static App getInstance(){
return mInstance;
}
}
4、调用接口获取数据
public class MainActivity extends AppCompatActivity {
public static final String TAG = "MainActivity";
/**
* Hello World!
*/
private TextView mTvHello;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mTvHello = (TextView) findViewById(R.id.tv_hello);
App.apiService(ApiService.class)
.getKnowledgeSystem(1, 60)
.compose(RxSchedulers.<KnowledgeSystem>io_main())
.subscribe(new Consumer<KnowledgeSystem>() {
@Override
public void accept(KnowledgeSystem knowledgeSystem) throws Exception {
Log.e(TAG, "KnowledgeSystem--" + knowledgeSystem.toString());
mTvHello.setText(knowledgeSystem.toString());
}
}, new Consumer<Throwable>() {
@Override
public void accept(Throwable throwable) throws Exception {
Log.e(TAG, "Throwable--" + throwable.toString());
}
});
}
}
网友评论