就看天氣V2.0-RxAndroid+Retrofit+Glide+Matrial Design Weather App
來自: http://www.jianshu.com/p/03621fce1736
前言
最初上線是在2015年10月,是自己第一個較為成熟的應用,開發完之后剛好答了知乎這篇 如何自學Android編程
但是因為代碼確實寫的很爛,所以決定全部重構代碼全新風格的展示就看天氣Ver2.0.
當然自己也在學習之中,如果發現有任何問題和建議,隨時歡迎Email或者開Issues
- 開源不易,希望能給個Star鼓勵
- 項目地址: https://github.com/xcc3641/SeeWeather
- 項目主頁發布issue: https://github.com/xcc3641/SeeWeather/issues
- 本項目為開源項目,技術交流可以通過郵箱聯系: Hugo3641@gmail.com
簡介
就看天氣——是一款遵循 Material Design 風格的只看天氣的APP。無流氓權限,無自啟,xxx,用最少的權限做最優的體驗。
- 卡片展現(當前天氣情況,未來幾小時天氣情況,生活建議,一周七天概況)
- 補全城市(第一版本因為自己偷懶所以城市有缺陷對不起各位)
- 自動定位
- 緩存數據,減少網絡請求,保證離線查看
- 內置兩套圖標(設置里更改)
- 彩蛋(自動夜間狀態)
權限說明
<!--用于進行網絡定位--> <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"/> <!--用于訪問GPS定位--> <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/> <!--獲取運營商信息,用于支持提供運營商信息相關的接口--> <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/> <!--用于訪問wifi網絡信息,wifi信息會用于進行網絡定位--> <uses-permission android:name="android.permission.ACCESS_WIFI_STATE"/> <!--這個權限用于獲取wifi的獲取權限,wifi信息會用來進行網絡定位--> <uses-permission android:name="android.permission.CHANGE_WIFI_STATE"/> <!--用于訪問網絡,網絡定位需要上網--> <uses-permission android:name="android.permission.INTERNET"/> <!--用于讀取手機當前的狀態--> <uses-permission android:name="android.permission.READ_PHONE_STATE"/> <!--寫入擴展存儲,向擴展卡寫入數據,用于寫入緩存定位數據--> <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/> <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
版本更新&&下載地址
Fir.im: http://fir.im/seeWeather
豌豆莢: http://www.wandoujia.com/apps/com.xiecc.seeWeather
魅族應用中心: http://developer.meizu.com/console/apps/detail/6530883
酷安市場: http://www.coolapk.com/apk/com.xiecc.seeWeather
v2.0
- 重構代碼,全新UI,升級體驗
- 就看天氣——是一款遵循 Material Design 風格的只看天氣的APP。無流氓權限,無自啟,xxx,用最少的權限做最優的體驗。
- 卡片展現(當前天氣情況,未來幾小時天氣情況,生活建議,一周七天概況)
- 彩蛋(自動夜間狀態)
- 補全城市(第一版本因為自己偷懶所以城市有缺陷對不起各位)
- 緩存數據,減少網絡請求,保證離線查看
- 內置兩套圖標(設置里更改)
v1.1
- 加固
- 兼容更多系統版本
v1.0
- 就看天氣V1.0
- @圖片和信息來源于網絡,侵權刪
TODO
這學期有點忙,需要花時間鞏固基礎,準備面試,但是自己還是會抽空盡快做出這些功能的,謝謝大家理解和支持
- [ ] 桌面小部件
- [ ] 通知欄提醒
- [ ] 更好,更多的天氣ICONS
- [ ] 管理城市(多城市選擇)
- [x] 自動定位
- [ ] 自由定制的Item界面
項目
公開 API
天氣數據來源于:和風天氣
城市信息來源于:CSDN
地理定位服務: 高德地圖
開源技術
簡單介紹代碼
網絡
就看天氣的網絡部分的支持是用 RxJava+RxAndroid+Retrofit+Gson 再加上 ACache 緩存
/** * <p/> * 首先從本地緩存獲取數據 * if 有 * 更新UI * else * 直接進行網絡請求,更新UI并保存在本地 */ private void fetchData() { observer = new Observer<Weather>() { //節約篇幅,已省略 ... }; fetchDataByCache(observer); } /** * 從本地獲取 */ private void fetchDataByCache(Observer<Weather> observer) { Weather weather = null; try { weather = (Weather) aCache.getAsObject("WeatherData"); } catch (Exception e) { Log.e(TAG, e.toString()); } if (weather != null) { //distinct去重 Observable.just(weather).distinct().subscribe(observer); } else { fetchDataByNetWork(observer); } } /** * 從網絡獲取 */ private void fetchDataByNetWork(Observer<Weather> observer) { String cityName = mSetting.getString(Setting.CITY_NAME, "重慶"); RetrofitSingleton.getApiService(this) .mWeatherAPI(cityName, key) .subscribeOn(Schedulers.io()) .observeOn(AndroidSchedulers.mainThread()) ////節約篇幅,已省略 ... }
RecycerVIew展示
就像洪洋說的一樣
整體上看RecyclerView架構,提供了一種插拔式的體驗,高度的解耦,異常的靈活,通過設置它提供的不同LayoutManager,ItemDecoration , ItemAnimator實現令人瞠目的效果。
該項目中用到RecyclerView中級的用法是根據itemType展示不同的布局,這就是主頁核心的代碼了。
@Override public int getItemViewType(int position) { if (position == TYPE_ONE) { //標識 ... } return super.getItemViewType(position); } @Override public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { if (viewType == TYPE_ONE) { //綁定 ... } } } @Override public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) { if (holder instanceof NowWeatherViewHolder) { //更新布局 .... } }
截圖
感謝
感謝開源,學習到了前輩們優秀的代碼
特別感謝簡書猿圈
關于作者
簡書: http://www.jianshu.com/users/3372b4a3b9e5/latest_articles
知乎: https://www.zhihu.com/people/xcc3641.github.io
個人博客: http://IMXIE.CC
請我喝杯咖啡
LICENSE
Copyright 2016 HugoXie Licensed under the Apache License, Version 2.0 (the \"License\")
you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License.
圖片來源于網絡,版權屬于原作者。