将mvp和rxjava和retrofit简单整合的列子,让activity的代码不再那么臃肿,只负责显示数据.
关于mvp的介绍可以看这里,
关于Rxjava的介绍可以看这里;
关于retrofit的介绍可以看这里(看官方文档应该是最有效率的2333…);
首先看一下获取数据的接口链接:
http://apicloud.mob.com/v1/weather/query?province=%E6%B9%96%E5%8D%97&key=520520test&city=%E9%95%BF%E6%B2%99;
普通的请求方式是这样的:
定义一个接口:
1 2 3 4 5 6
| 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); }
|
创建一个Retrofit对象:
1 2 3 4 5 6 7
| Retrofit retrofit = new Retrofit.Builder() .baseUrl(ApiStores.API_SERVER_URL) .addConverterFactory(GsonConverterFactory.create()) .build(); ApiStores service = retrofit.create(ApiStores.class); Call<WeatherModel> repos=service.getWeatherByAddress("湖南","长沙");
|
然后通过返回的call 来发出网络请求:
1 2 3 4 5 6 7 8 9 10 11
| 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("===","失败"); } });
|
这样已经可以完成数据的请求了,但是这样代码都在activity里,如果代码变多activity会变得臃肿起来,不够优雅…╮(╯_╰)╭
使用mvp+rxjava+retrofit:
retrofit对Rxjava的支持是非常好的,可以直接返回可观察者,像这样:
1 2
| @GET("query") Observable<WeatherModel> getWeatherByAddress(@Query("key") String key,@Query("province") String province, @Query("city") String city);
|
我们拿到可观察者后,就可以订阅事件了:
1 2 3
| mCompositeSubscription.add(observable.subscribeOn(Schedulers.io()) .observeOn(AndroidSchedulers.mainThread()) .subscribe(subscriber));
|
rxjava最nb的地方就是它可以很方便的切换线程不需要使用各种runOnUiThread
完整代码可以看这个;