將mvp和rxjava和retrofit簡單整合的列子,讓activity的代碼不再那么臃腫,只負責顯示數(shù)據(jù).
關于mvp的介紹可以看這里荚板,
關于Rxjava的介紹可以看這里;
關于retrofit的介紹可以看這里(看官方文檔應該是最有效率的2333...);
首先看一下獲取數(shù)據(jù)的接口鏈接:
http://apicloud.mob.com/v1/weather/query?province=%E6%B9%96%E5%8D%97&key=520520test&city=%E9%95%BF%E6%B2%99;
普通的請求方式是這樣的:
定義一個接口:
public interface ApiStores {
String API_SERVER_URL = "http://apicloud.mob.com/v1/weather/";
String KEY = "....";
@GET("query")
Call<WeatherModel> getWeatherByAddress(@Query("key") String key,@Query("province") String province, @Query("city") String city);
}
創(chuàng)建一個Retrofit對象:
Retrofit retrofit = new Retrofit.Builder()
.baseUrl(ApiStores.API_SERVER_URL)
//增加返回值為Gson的支持(以實體類返回)
.addConverterFactory(GsonConverterFactory.create())
.build();
ApiStores service = retrofit.create(ApiStores.class);
Call<WeatherModel> repos=service.getWeatherByAddress("湖南","長沙");
然后通過返回的call 來發(fā)出網(wǎng)絡請求:
call.enqueue(new Callback<String>() {
@Override
public void onResponse(Call<String> call, Response<WeatherModel> response)
{
Log.e("===","return:"WeatherModel.getname);//返回值直接就是對象,簡直不要太爽...
}
@Override
public void onFailure(Call<String> call, Throwable t) {
Log.e("===","失敗");
}
});
這樣已經(jīng)可以完成數(shù)據(jù)的請求了,但是這樣代碼都在activity里,如果代碼變多activity會變得臃腫起來,不夠優(yōu)雅...╮(╯_╰)╭
使用mvp+rxjava+retrofit:
retrofit對Rxjava的支持是非常好的煤搜,可以直接返回可觀察者,像這樣:
@GET("query")
Observable<WeatherModel> getWeatherByAddress(@Query("key") String key,@Query("province") String province, @Query("city") String city);
我們拿到可觀察者后,就可以訂閱事件了:
mCompositeSubscription.add(observable.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(subscriber));
rxjava最nb的地方就是它可以很方便的切換線程不需要使用各種runOnUiThread
完整代碼可以看這個;