日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > java >内容正文

java

java天气app_MVP+RxJava2+Retrofit2 实况天气app

發布時間:2023/12/15 java 35 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。