java天气app_MVP+RxJava2+Retrofit2 实况天气app
前言
我在這些文章中有介紹一些框架的簡單使用方法,但是是分開使用的,現在我們把這些框架結合起來,來搭建一個簡單的實況天氣app,首先我會用MVP模式搭建app的大致框架,然后將RxJava2和Retrofit2結合起來,搭建一個網絡請求及異步處理的框架,用它來獲取網絡數據,最后,進行一些界面上的優化。
先來看一下最后的效果圖
界面截圖
界面截圖
界面截圖
看起來還行?好吧,交互起來應該會比較好看,截圖emmmmm....
行吧,接下來開始
MVP框架搭建
mvp基本組成
我們的app功能是天氣情況的展示,因此不需要太多的界面,我們只創建一個界面,之后如果有需要可以按MVP的模式添加。
MainActivity的作用是對界面布局的初始化以及數據內容的展示,MainPresenter的作用是進行網絡數據的獲取,MainContract接口是定義MainActivity和MainPresenter之間的接口協議。
先來看一下MainContact的內容
MainContract協議類
在MainContract中,我們定義了View(也就是Activity)和Presenter中所要做的工作。在Presenter中定義了一個getData方法,我們將調用它來進行網絡數據的獲取,之后會在MainPresenter中實現這個方法。在View中定義了setData和dataError兩個方法,分別用于獲取數據操作后,數據獲取成功和數據獲取失敗之后的UI更新操作,之后需在MainActivity中實現。
看一下MainPresenter
MianPresenter類
MainPresenter中的getData方法,是我們寫網絡請求邏輯的地方,之后我會用RxJava+Retrofit進行實現。
再看一下MainActivity
主界面Activity
可以看到我在MainActivity里定義了一個Button和一個TextView,在點擊Button之后會進行presenter的getData操作,也就是進行網絡數據的請求,請求之后會對TextView進行更新UI的操作,如果成功就顯示天氣的信息,如果失敗就顯示報錯的信息。
這并不是我們最后的界面,這里只是對getData數據的簡單驗證。確保數據能成功拿到之后,我們再來對具體的UI進行編寫。
上面是我們對MVP框架的搭建,不清楚的地方可以看Android MVP框架學習實踐 - 簡書
RxJava+Retrofit網絡請求框架搭建
RxJava 和 Retrofit 之間有很好的兼容性,這也是這兩個框架的組合目前那么火的原因。我們現在來實現一下。
首先需要創建一個retrofit的實例,和風天氣的數據api接口地址為 https://free-api.heweather.com
創建retrofit實例
可以看到,這里比我們創建基礎的retrofit實例多了兩句方法,addConverterFactory和addCallAdapterFactory,addConverterFactory方法設置了Gson作為對象序列化和反序列化所用的轉換器,addCallAdapterFactory的設置是讓retrofit可以返回一個除了Call以外的類型,比如說我們這里是讓它返回一個Observable類型,用于之后rxjava相關操作。
WeatherService
這是我們定義的WeatherService接口,用來寫數據相關的網絡請求,可以看到之前單獨使用retrofit時返回的是Call類型,但是在這里變成了Observable類型。WeatherEntity是我們定義的網絡請求數據的實體類,是根據api中定義的數據類型生成的Bean類,下面是和風天氣Api官方給出的數據請求返回示例。
數據返回信息
這里給大家安利一個Android Studio的插件GsonFormat,這個真的很爽,只要傳入json數據就可以一鍵生成實體類。
GsonFoemat
WeatherEnity
簡直不要太爽。好了繼續。
在調用天氣api時,官方要求傳入兩個參數,一個是開發者的key,一個是所要查詢天氣的城市拼音。因此我們用Query注解將這兩個參數加到接口地址之后,在之后調用方法時傳入參數。
網絡請求
retrofit+rxjava
接下來的操作就是創建一個WeatherService類調用他的getWeather方法,傳入參數開發者key和所要查詢的城市名拼音。我們會發現,之前在單獨使用retrofit的時候,我是直接拿到了一個call類型,然后直接對回調方法進行操作
單獨使用retrofit時的call
但是這里怎么好像不一樣了,怎么感覺和rxjava一樣。沒錯,由于之前我們設置了getWeather方法的返回類型是Observable類,因此,我們這邊可以直接對他進行rxjava的鏈式調用操作,subscribeOn方法聲明請求是在io線程上執行,ObserveOn聲明回調的操作是在UI線程上執行,subscribe里定義的便是請求之后的操作。我們可以在onNext中直接拿到網絡請求之后得到的天氣情況信息。如果數據請求成功,我們就在界面上顯示天氣的數據,如果失敗,就顯示錯誤信息。
至此,我們就完成了rxjava+retrofit的網絡請求部分。可以先跑一下demo。
數據獲取粗略展示
可以看到,點擊Button之后,界面上顯示的是返回的天氣信息,說明我們成功的拿到了數據。當然,這里我們只拿到了一個城市的數據,我們的目標是能展示多個城市的天氣情況,以及有一個看的過去的界面,我們繼續努力一下。
進一步
上面,我們已經拿到了一個城市的數據,現在我們來嘗試獲取多個城市的數據,一般來說,多個城市的數據,你可以和后臺小哥商量好,直接返回給你一個擁有多個城市天氣數據的json數組,但是我們現在用的和風天氣api并沒有提供給我們這樣的接口,因此,我們需要一個城市一個城市地去請求數據。因此,我們可以有以下操作。
遍歷多個城市獲取城市天氣數據
我們可以傳入一個城市的名稱數組cities,然后去遍歷這個數組里面的城市名,然后分別進行網絡請求,再在onNext中將請求拿到的數據統一放入一個weatherEntities城市天氣鏈表中,等所有城市的天氣數據拿到之后,在onComplete中將這個鏈表傳遞給View進行UI界面的數據更新。
更新界面
View中可以拿到數據,進行界面更新。
界面的展示,我用到了一個開源的UI框架,GitHub - loopeer/CardStackView: One Custom view for show something just like cards with animations. (GitHub上有很多寶貝呢,嘿嘿),我對它的源碼進行了一些修改,讓它能針對我們的天氣數據能進行展示。這個框架的使用,和我們平時使用的recyclerview差不多,主要的工作就是寫寫adapter,viewholder和item的布局,用起來還是挺方便的。
adapter中對視圖的綁定以及一些將拿到的數據設置到相應布局中的操作
item布局的編寫
最后再在Activity中綁定我們的視圖,設置我們所編寫的adapter,傳入數據,大功告成!看看gif(行吧,這畫質emmmmm,.....)
動圖展示
總結
在這個簡單的demo中,我們用到了mvp+rxjava+retrofit的開發模式,如果你去嘗試過,你就會發現,這種開發模式相對與一般的開發模式,不管是在邏輯思路,編寫效率,以及app性能上,都有著明顯的優勢,這大概就是這個開發模式大火的原因吧。當然,我這個天氣app寫的很粗糙,對于一些方法上,如果是一個比較大,內容功能比較多的app最好是進行一些封裝,對于網絡請求,最好也是有緩存的策略,可以改進的有很多地方,不過寫成這樣簡單,也對理解mvp+rxjava+retrofit 這個框架有一定的好處,哈哈。
我這里貼出這個項目的GitHub地址 ? GitHub - reggie1996/Weather ?? 感興趣的朋友可以把代碼拉下來玩一下,也可以一起交流,相互進步,嘿嘿。
總結
以上是生活随笔為你收集整理的java天气app_MVP+RxJava2+Retrofit2 实况天气app的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 知乎水印图片怎么设置
- 下一篇: 知乎摇动发送反馈怎么关闭