[Android開源]RxAndroid+Retrofit+Glide+Material Design Weather App

就看天氣

_java

前言

最初上線是在2015年10月,是本身第一個較爲成熟的應用,開發完以後恰好答了知乎這篇如何自學Android編程android

可是由於代碼確實寫的很爛,因此決定所有重構代碼全新風格的展現就看天氣Ver2.0.git

固然本身也在學習之中,若是發現有任何問題和建議,隨時歡迎Email或者開Issuesgithub

注意:要pull下來運行須要本身申請和風天氣的key,寫在Setting裏。面試

簡介

就看天氣——是一款遵循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

地理定位服務: 高德地圖

開源技術

  1. Rxjava

  2. RxAndroid

  3. Retrofit

  4. GLide

  5. ASimpleCache

簡單介紹代碼

網絡

就看天氣的網絡部分的支持是用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://weibo.com/xcc3641

我的博客: 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.

圖片來源於網絡,版權屬於原做者。

相關文章
相關標籤/搜索