就看天氣V2.0-RxAndroid+Retrofit+Glide+Matrial Design Weather App

vnzs9267 8年前發布 | 42K 次閱讀 RxAndroid Retrofit 移動開發

來自: http://www.jianshu.com/p/03621fce1736

前言

最初上線是在2015年10月,是自己第一個較為成熟的應用,開發完之后剛好答了知乎這篇 如何自學Android編程

但是因為代碼確實寫的很爛,所以決定全部重構代碼全新風格的展示就看天氣Ver2.0.

當然自己也在學習之中,如果發現有任何問題和建議,隨時歡迎Email或者開Issues

簡介

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

圖片來源于網絡,版權屬于原作者。

 本文由用戶 vnzs9267 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!