时间:2021-05-19
本文所要介绍的简易天气App主要用RxAndroid、MVP、Retrofit实现,首先来看看效果:
主页内容:
右侧栏天气列表:
左侧栏城市列表
首先看看Activity主要代码(使用MVP模式):
//调用Presenter的方法获取数据 mMainPresenter = new MainPresenterImpl(this); mMainPresenter.getPlaceData(); mMainPresenter.getWeatherData("成都"); //显示主页和右侧栏天气数据 public void setupWeatherData(WeatherResponse weatherResponse) { if (weatherResponse == null) return; setTitleText(DateUtils.getWeekDay(weatherResponse.date)); if (weatherResponse.results != null && weatherResponse.results.size() > 0) { WeatherResult result = weatherResponse.results.get(0); mTvCity.setText(getString(R.string.city, result.currentCity)); mTvPm25.setText(getString(R.string.pm25, result.pm25)); mWeatherDataAdapter.setData(result.weather_data); mWeatherDataAdapter.notifyDataSetChanged(); mWeatherExtraAdapter.setData(result.index); mWeatherExtraAdapter.notifyDataSetChanged(); } } //显示左侧栏城市列表 @Override public void setupPlaceData(List<Place> placeList) { if (placeList == null) { return; } mPlaceAdapter.setData(placeList); mPlaceAdapter.notifyDataSetChanged(); }接下来看看如何在Presenter中应用RxJava、RxAndroid获取数据
//获取天气数据 @Override public void getWeatherData(String place) { if (TextUtils.isEmpty(place)) { return; } mMainView.showProgress(); ServiceManager.getInstance().getApiService().getWeatherInfo(place, Constants.BAIDU_AK) .subscribeOn(Schedulers.io()) .observeOn(AndroidSchedulers.mainThread()) .subscribe(new Subscriber<WeatherResponse>() { @Override public void onCompleted() { Log.e(TAG, "onCompleted"); mMainView.hideProgress(); } @Override public void onError(Throwable e) { Log.e(TAG, e.getMessage(), e); mMainView.hideProgress(); } @Override public void onNext(WeatherResponse weatherResponse) { mMainView.setupWeatherData(weatherResponse); } }); } public interface ApiService { @GET("service/getIpInfo.php") Observable<GetIpInfoResponse> getIpInfo(@Query("ip") String ip); //http://api.map.baidu.com/telematics/v3/weather?location=%E6%88%90%E9%83%BD&output=json&ak=MPDgj92wUYvRmyaUdQs1XwCf @GET("/telematics/v3/weather?output=json") Observable<WeatherResponse> getWeatherInfo(@Query("location") String location, @Query("ak") String ak); }如上所述,我们通过百度api获取天气数据使用的是Retrofit框架,它能自动的返回Observable对象。
那么我们如何通过RxJava获取本地文件中的城市列表呢?(为了方便演示,我将城市列表作为一个json字符串放于文件中)
通过上述代码,我们就能完成界面所示功能了,是不是省去了Handler callback,new Thread()这些操作了,这就为什么说RxJava是用来解决Callback Hell的。
”在Activity中分别调用了获取天气数据和城市列表的方法,那么问题来了,如果取数据的时候显示了process Dialog, 我该在什么时候结束呢,写flag判断?“
最直接的最暴力的方法就是直接在一个方法里同步调用两个接口,那使用RxJava怎么实现呢?
这个问题可以使用RxJava的Merge操作符实现,故名思议就是将两个接口Observable合成一个,废话不说直接上代码:
@Override public void getPlaceAndWeatherData(String place) { mMainView.showProgress(); PlaceRepository repository = new PlaceRepository(); Context context = BaseApplication.getInstance(); Observable placeObservable = repository.getPlaceList(context); Observable weatherObservable = ServiceManager.getInstance().getApiService().getWeatherInfo(place, Constants.BAIDU_AK); Observable.merge(placeObservable, weatherObservable) .subscribeOn(Schedulers.io()) .observeOn(AndroidSchedulers.mainThread()) .subscribe(new Subscriber<Object>() { @Override public void onCompleted() { mMainView.hideProgress(); } @Override public void onError(Throwable e) { mLogger.error(e.getMessage(), e); mMainView.hideProgress(); } @Override public void onNext(Object obj) { if (obj instanceof List) { mMainView.setupPlaceData((List<Place>) obj); } else if (obj instanceof WeatherResponse) { mMainView.setupWeatherData((WeatherResponse) obj); } } }); }
这样就很巧妙的解决了如果取数据的时候显示process Dialog、该在什么时候结束、写flag判断的问题。
如果这样的代码看着还不舒服,你完全可以使用Lambda,这样可以让代码看起来少之又少,不过Android studio目前还不支持Lambda,如果想要使用请安装插件RetroLambda 并且JDK 使用JDK 8以上版本.
Github源码地址:https://github.com/mickyliu945/CommonProj
声明:本页内容来源网络,仅供用户参考;我单位不保证亦不表示资料全面及准确无误,也不保证亦不表示这些资料为最新信息,如因任何原因,本网内容或者用户因倚赖本网内容造成任何损失或损害,我单位将不会负任何法律责任。如涉及版权问题,请提交至online#300.cn邮箱联系删除。
android通过googleAPI获取天气信息复制代码代码如下:publicclassWeatherActivityextendsActivity{priva
本文实例为大家分享了Android实现简易计算器小程序的具体代码,供大家参考,具体内容如下目标效果:通过编写代码,可以实现整数和小数的加减乘除运算,以及删除和清
本文使用Matrix实现Android实现图片缩放与旋转。示例代码如下:复制代码代码如下:packagecom.android.matrix;importand
Android模拟器出现错误解决办法:1.Unabletogetviewserverversionfromdeviceexlipse下编写好android应用程
本文实例为大家分享了jQuery编写QQ简易聊天框的具体代码,供大家参考,具体内容如下QQ简易聊天框.chatBodyulli{list-style-type: