国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 系統 > Android > 正文

編寫簡易Android天氣應用的代碼示例

2020-04-11 10:45:04
字體:
來源:轉載
供稿:網友

本文所要介紹的簡易天氣App主要用RxAndroid、MVP、Retrofit實現,首先來看看效果:
主頁內容:

2016224152122404.jpg (506×900)

右側欄天氣列表:

2016224152144520.jpg (506×900)

左側欄城市列表

2016224152203002.jpg (506×900)

首先看看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")   Call<GetIpInfoResponse> getIpInfo(@Query("ip") String ip);*/    @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字符串放于文件中)

@Override public void getPlaceData() {   PlaceRepository repository = new PlaceRepository();   repository.getPlaceList(BaseApplication.getInstance())       .subscribeOn(Schedulers.io())       .observeOn(AndroidSchedulers.mainThread())       .subscribe(new Subscriber<List<Place>>() {         @Override         public void onNext(List<Place> places) {           mMainView.setupPlaceData(places);         }          @Override         public void onCompleted() {          }          @Override         public void onError(Throwable e) {          }       }); } public class PlaceRepository {    public Observable<List<Place>> getPlaceList(final Context context) {     return Observable.create(new Observable.OnSubscribe<List<Place>>() {       @Override       public void call(Subscriber<? super List<Place>> subscriber) {         try {           AssetManager assertManager = context.getAssets();           InputStream inputStream = assertManager.open("place");           ByteArrayOutputStream outStream = new ByteArrayOutputStream();           byte[] data = new byte[1024];           int count = -1;           while((count = inputStream.read(data,0, 1024)) != -1) {             outStream.write(data, 0, count);           }           String json = new String(outStream.toByteArray(),"UTF-8");           Gson gson = new GsonBuilder().create();           List<Place> placeList = gson.fromJson(json, new TypeToken<List<Place>>() {}.getType());           subscriber.onNext(placeList);         } catch (Exception e) {           subscriber.onError(e);         }         subscriber.onCompleted();       }     });   } } 

通過上述代碼,我們就能完成界面所示功能了,是不是省去了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

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 毕节市| 肥乡县| 黑河市| 台山市| 兰西县| 广河县| 临颍县| 榆中县| 佛冈县| 石家庄市| 沙湾县| 克山县| 隆回县| 阳东县| 如东县| 太仆寺旗| 安徽省| 阿拉善盟| 丹寨县| 呼玛县| 阳新县| 共和县| 河曲县| 莱阳市| 湖北省| 阜康市| 宁明县| 和硕县| 萝北县| 顺义区| 三河市| 秦安县| 监利县| 东港市| 镇沅| 荥经县| 循化| 吴旗县| 安康市| 汉源县| 商水县|