天氣查看APP

學了一點Android,想寫點東西。今天和大家分享下啊!

摘要
本系統主要對基於Android平臺的天氣預報軟件的實現進行研究。軟件系統的主體功能是利用網絡訪問和風天氣提供的端口獲取實時天氣、預測天氣狀況及各種環境參數。並以圖文並茂的形式通過軟件展示給用戶。可以通過軟件設置城市獲得所需的城市的天氣狀況。軟件主要體現在用戶體驗上,工具箱中有多種應用。如拍照、查看相冊及手電筒等。對用戶設置的城市進行管理,方便用戶再次查詢。加強軟件的可行性。

1.作品簡介
隨着移動互聯網的興起及Android機的普及,智能手機已經成爲人們日常生活中必比可少的工具。尤其國產Android手機的發展快速迅猛,相比於蘋果手機有價格上的優勢,故市場潛力巨大。目前,手機的功能已經不僅僅是打電話發短信,更多的是爲我們的生活生產提供便利條件。以往人們不太方便獲取的信息,通過手機上網可以實時獲取。比如以往人們獲取天氣預報的方式多爲收看電視節目或收聽廣播,而智能手機的出現可以通過網絡更快更方便地獲取天氣信息。基於以上原因,本項目製作了一款界面簡潔,操作簡單的Android端天氣預報應用。
看天氣是一款集成天氣預測、實時更新、拍照、手電筒等一體的簡單實時小工具。天氣數據來源於和風天氣,調用系統相機、相冊、手電筒等功能。
在這裏插入圖片描述
圖1 目錄框架

看天氣1.0版本實現了根據位置查看中國3240個市縣區的實時顯示天氣狀況,7天預測、168小時逐小時預報,以及生活指數實況和預報、空氣質量實況和預報,下拉刷新天氣狀況;我管理的城市可以同時查看3個地區的天氣狀況;相機以及相冊的調用;手機閃光燈的使用(不同的手機和android版本可能用不了),目前只兼容少量機型;分享功能還不完善,目前只能發一段簡單的語句;關於是一個簡單的本軟件介紹。
2.設計思路
2.1UI設計
在這裏插入圖片描述
如上圖,採用左滑菜單佈局。在界面中大量使用了RelativeLayout、LinearLayout等佈局方式。主界面顯示一些實時顯示天氣狀況,7天預測、168小時逐小時預報,以及生活指數實況和預報、空氣質量實況和預報。測滑菜單設置了一些小工具,方便用戶使用,同時一個軟件集合了多個軟件的功能。體現了我們軟件的精髓短小精幹。

2.2模塊設計
爲了完成這個完整的APP,我劃分了幾個小的模塊來實現。首先是天氣預報的實現,在天氣預報方面我們調用了和風天氣的API(https://dev.heweather.com/)來獲取實現時顯示天氣狀況,7天預測、168小時逐小時預報,以及生活指數實況和預報、空氣質量實況和預報的數據。在把這幾個功能分成小個的activity,最後組合爲我們看到的主界面。
在這裏插入圖片描述

相機的調用目前只是通過下列代碼簡單的實現系統相機的調用,沒有對相機做任何優化處理。這是需要完善的一個部分,到後面希望可以實現及實時照片的顯示,圖片原圖的優化,防止照片多大而造成內存溢出的嚴重問題。
Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
startActivity(intent);
相冊的查看也是一個簡單的調用,沒有對圖片進行處理,排版、圖片文件都沒有達到選擇的目的。這也是需要完善的地方。下面是調用相冊的代碼。
Intent intent = new Intent(“android.intent.action.GET_CONTENT”);
intent.setType(“image/*”);
startActivityForResult(intent, REQUEST_SYSTEM_PIC);
手電筒目前只能適應部分機型。

3.功能說明
3.1天氣查看
天氣的實現我們通過使用和風天氣的數據來完成天氣的查看。通過選擇自己所在城市將城市id傳入API接口加上天氣類型就可以得到對應的數據,接下來就是對數據的Gson化與適配。
在這裏插入圖片描述
3.2相機
目前相機的使用只是做了簡單的調用,沒有涉及圖片處理與優化。
在這裏插入圖片描述

3.3相冊
相冊的查看我們選擇出圖片文件展示出來。

在這裏插入圖片描述
3.5手電筒
我們通過調用手機的功能攝像頭閃光燈來實現手電筒功能,部分手機可能不能正常使用(完善中)
在這裏插入圖片描述

3.6分享
分享功能可以實現通過QQ或微信發出信息。
在這裏插入圖片描述

4.關鍵技術
4.1訪問網絡
在該天氣查詢中使用到網絡訪問的問題。下面介紹一下網絡訪問的相關事項。
因爲我們需要訪問網絡,所以要添加訪問網絡的權限。代碼如下:

4.2Handler消息機制
在開發中更新我們刷新視圖都需要在主線程中更新,子線程是不支持更新視圖操作的。所以當我們做一些耗時操作的時候可以不能馬上得到反饋刷新UI,比如下載文件或者下載圖片這些操作都比較耗時,我們一般會重新創建一個子線程異步處理耗時操作,這樣就不會堵塞主線程導致卡頓的情況。異步處理成功後如果這個時候我們需要更新視圖操作就不能直接更新了,這個時候Handler就起到了作用。我們可以用Handler Looper MessageQueue這套異步消息處理機制來處理這種情況,線程中發送消息通知,主線程來處理消息刷新視圖。
Handler消息機制使用了生產消費者設計模式,簡單再來說,生產消費者模式就是類似於生活中寄快遞一樣,寄東西的人可以視爲生產者,而快遞員就是消息緩存區、快遞員負責全部快遞的維護和派發、只要還有快遞快遞員就是一直送到沒有爲止,收件人就是消費者負責接收快遞員的快件。可以看到整個過程發件人不需要關心收件人的具體情況,只需要把收件人的地址寫對就行。而快遞員也不需要關心發件人和收件人的信息,快遞員只負責收快遞按快遞地址送到到收件人手裏。收件人只需要等待快遞的送達就好了。
優點
• 低耦合
爲什麼不直接讓消費者調用生產者的某個方法?如果這樣直接調用必然會產生相互依賴的情況也就是耦合,如果以後生產者和消費者某一方變化都有可能會影響到對方,但是如果二者直接不直接依賴而是通過緩衝區來交互,這樣耦合性就大大減低了。
• 支持併發
生產者可以放心的產生數據直接扔給消息緩衝區,而不用等待消費者那邊是否已經處理完了消息,而導致生產者等待狀態(生產者消息堵塞),這樣就可以不用依賴消費者的處理速度了,互相獨立。
• 自由發揮
這種模式還有一好處就是,如果生產者生產的數據速度過快,而消費者那邊處理的比較慢,那麼這個時候消息都會存在於緩衝區。這樣生產者就能慢慢的消費這些數據了,所以定爲自由發揮。
在這裏插入圖片描述
流程圖
Handler Looper MessageQueue的職責
在這裏插入圖片描述
流程圖
MessageQueue 就是設計模式中的緩衝區,它負責接收生產者發送過來的數據先進先出的隊列形式,保存着所有消息。在UI Thread中通過looper 不斷從MessageQueue 取出消息在執行任務。
Looper 的主要工作就是維護MessageQueque中的消息隊列,它負責從MessageQueue中取出要執行的消息任務,先判斷Looper是否爲null,不爲null就循環狀態不斷從MessageQueue中取出消息,然後通過dispatchMessage派發出去就行處理。

4.3Gson文件解析
Gson(又稱Google Gson)是Google公司發佈的一個開放源代碼的Java庫,主要用途爲序列化Java對象爲JSON字符串,或反序列化JSON字符串成Java對象。而JSON(JavaScript Object Notation) 是一種輕量級的數據交換格式,易於人閱讀和編寫,同時也易於機器解析和生成,廣泛應用於各種數據的交互中,尤其是服務器與客戶端的交互。
我們把和風天氣平臺請求來的數據進行Gson化,轉爲方便我們處理的數據,並填到對應的位置。即完成了了數據的Gson化。
4.4Fragment使用
Fragment,俗稱碎片,自Android 3.0開始被引進並大量使用。作爲Activity界面的一部分,Fragment的存在必須依附於Activity,並且與Activity一樣,擁有自己的生命週期,同時處理用戶的交互動作。同一個Activity可以有一個或多個Fragment作爲界面內容,並且可以動態添加、刪除Fragment,靈活控制UI內容,也可以用來解決部分屏幕適配問題。
在這裏插入圖片描述
• onAttach():Fragment和Activity相關聯時調用。可以通過該方法獲取Activity引用,還可以通過getArguments()獲取參數。
• onCreate():Fragment被創建時調用。
• onCreateView():創建Fragment的佈局。
• onActivityCreated():當Activity完成onCreate()時調用。
• onStart():當Fragment可見時調用。
• onResume():當Fragment可見且可交互時調用。
• onPause():當Fragment不可交互但可見時調用。
• onStop():當Fragment不可見時調用。
• onDestroyView():當Fragment的UI從視圖結構中移除時調用。
• onDestroy():銷燬Fragment時調用。
• onDetach():當Fragment和Activity解除關聯時調用。
Fragment的優勢有一下幾點:
• 模塊化(Modularity):我們不必把所有代碼全部寫在Activity中,而是把代碼寫在各自的Fragment中。
• 可重用(Reusability):多個Activity可以重用一個Fragment。
• 可適配(Adaptability):根據硬件的屏幕尺寸、屏幕方向,能夠方便地實現不同的佈局,這樣用戶體驗更好
4.5Drawerlaout
DrawerLayout官方給我們提供的一個側滑菜單控件,3.0以後引入,低版本使用它,需要v4兼容包, 使用的時候需要注意的是:
1.主內容視圖一定要是DrawerLayout的第一個子視圖
2.主內容視圖寬度和高度需要match_parent
3.代碼中使用的時候,要調用openDrawer方法來打開
4.必須顯示指定側滑視圖的android:layout_gravity屬性
android:layout_gravity = “start”時,從左向右滑出菜單
android:layout_gravity = “end”時,從右向左滑出菜單
不推薦使用left和right,側滑視圖的寬度以dp爲單位,不建議超過320dp(爲了總能看到一些主內容視圖)
4.6viewPage
ViewPager是Android擴展包v4包中的類,她可以實現左右切換當前的view,實現滑動切換的效果。用相應的適配器Adapter關聯上面的頁卡(View/Fragment)和ViewPager。
PagerAdapter 數據源:List
FragmentPagerAdapter數據源:List
FragmentStatePagerAdapter數據源:ListView
當頁卡是View時:用ViewPagerAdapter
當頁卡是Fragment時:用FragmentAdapter
4.7數據回調
Intent不但可以實現頁面跳轉,與帶值跳轉還可以實現數據回傳。
在這裏插入圖片描述
需要注意的是在同一個activity中可能會用onActivityResult(int requestCode,int resultCode ,Intent data)啓動多個不同的activity,這時每個activity返回的數據都會回調到onActivityResult()這個方法。因此用requestCode的值來判斷數據來源 ,resultCode判斷數據處理是否成功。最後取data中的數據。
4.8BaseAdpter適配器
下圖展示了數據源、適配器、ListView等數據展示控件之間的關係。我們知道,數據源是各種各樣的,而ListView所展示數據的格式則是有一定的要求的。數據適配器正是建立了數據源與ListView之間的適配關係,將數據源轉換爲ListView能夠顯示的數據格式,從而將數據的來源與數據的顯示進行解耦,降低程序的耦合性。這也體現了Android的適配器模式的使用。對於ListView、GridView等數據展示控件有多種數據適配器。
在這裏插入圖片描述
BaseAdapter的使用主要是通過繼承此類來實現BaseAdapter的四個方法:
public int getCount(): 適配器中數據集的數據個數;
public Object getItem(int position): 獲取數據集中與索引對應的數據項;
public long getItemId(int position): 獲取指定行對應的ID;
public View getView(int position,View convertView,ViewGroup parent): 獲取沒一行Item的顯示內容。
ListView的顯示與緩存機制
ListView、GridView等控件可以展示大量的數據信息。假如下圖中的ListView可以展示100條信息,但是屏幕的尺寸是有限的,一屏幕只能顯示下圖中的7條。當向上滑動ListView的時候,item1被滑出了屏幕區域,那麼系統就會將item1回收到Recycler中,即View緩衝池中,而將要顯示的item8則會從緩存池中取出佈局文件,並重新設置好item8需要顯示的數據,並放入需要顯示的位置。這就是ListView的緩衝機制,總結起來就是一句話:需要時才顯示,顯示完就被會收到緩存。ListView,GridView等數據顯示控件通過這種緩存機制可以極大的節省系統資源。
在這裏插入圖片描述

5.系統測試
我用小米8se,android9.0運行一切正常!
在這裏插入圖片描述

下載:https://download.csdn.net/download/weixin_43849104/11819742

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章