日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区

您的位置:首頁技術文章
文章詳情頁

我的 Android 開發實戰經驗總結

瀏覽:163日期:2022-09-27 10:58:09

以前一直想寫一篇總結 Android 開發經驗的文章,估計當時的我還達不到某種水平,所以思路跟不上,下筆又捉襟見肘。近日,思路較為明朗,于是重新操起鍵盤開始碼字一番。先聲明一下哈,本人不是大廠的程序猿。去年畢業前,就一直在當前創業小團隊從事自己熱愛的打碼事業至今。下面總結是建立在我當前的技術水平和認知上寫的,如有不同看法歡迎留下評論互相交流。

1.理解抽象,封裝變化

目前 Android 平臺上絕大部分開發都是用著 Java ,而跟 Java 這樣一門面向對象的語言打交道,不免要觸碰到 抽象 和 封裝 的概念。我身邊接觸過的一些開發者,有一部分還對這些概念停留在寫一個抽象類、接口、或者一個方法(或抽象方法)。至于為什么,我不大清楚是他們表達不出來,還是不理解。下面我也不高談闊論,直接舉例子來解釋我所理解的抽象。

//Activity 間使用 Intent 傳遞數據的兩種寫法 下面均是偽代碼形式,請忽略一些細節//寫法一//SrcActivity 傳遞數據給 DestActivityIntent intent = new Intent(this,DestActivity.class);intent.putExtra("param", "clock");SrcActivity.startActivity(intent);//DestActivity 獲取 SrcActivity 傳遞過來的數據String param = getIntent.getStringExtra("param");//寫法二//SrcActivity 傳遞數據給 DestActivityIntent intent = new Intent(this,DestActivity.class);intent.putExtra(DestActivity.EXTRA_PARAM, "clock");SrcActivity.startActivity(intent);//DestActivity 獲取 SrcActivity 傳遞過來的數據public final static String EXTRA_PARAM = "param";String param = getIntent.getStringExtra(EXTRA_PARAM);

寫法一,存在的問題是,如果 SrcActivity 和 DestActivity 哪個把 "param" 打錯成 "para" 或者 "paran" ,傳遞的數據都無法成功接收到。而寫法二則不會出現此類問題,因為兩個 Activity 之間傳遞數據只需要知道 EXTRA_PARAM 變量即可,至于 EXTRA_PARAM 變量到底是 "param" 、 "para" 、"paran" 這一點并不需要關心,這就是一種對可能發生變化的地方進行抽象封裝的體現,它所帶來的好處就是降低手抖出錯的概率,同時方便我們進行修改。

基于抽象和封裝,Java 本身很多 API 在設計上就有這樣的體現,如 Collections 中的很多排序方法:

我的 Android 開發實戰經驗總結

Collections中的排序API

這些方法都是基于 List 這個抽象的列表接口進行排序,至于這是一個用什么樣的數據結構實現 List(ArrayList 還是 LinkedList),排序方法本身并不關心。看,是不是體現了 JDK 的設計人員的一種抽象編程的思維,因為 List 的具體實現可能有千萬種,如果每一類 List 都要寫一套排序方法,估計要哭瞎了。

小結:把容易出現變化的部分進行抽象,就是對變化的一種封裝。

2.選好"車輪"

一個項目的開發,我們不可能一切從0做起,如果真是這樣,那同樣要哭瞎。因此,善于借用已經做好的 "車輪" 非常重要,如:

網絡訪問框架:okhttp、retrofit、android-async-http、volley圖片加載框架:Android-Universal-Image-Loader、Glide、Fresco、Picasso緩存框架:DiskLruCache、 RobospiceJson解析框架:Gson、Fastjson、Jackson事件總線:EventBus、OttoORM框架:GreenDAO、Litepal還有其他各種各樣開源的自定義控件、動畫等。除了以上提到的開源框架,也包括一些不開源的SDK數據統計:友盟統計,百度統計...奔潰搜集:騰訊bugly、bugtags...云存儲:七牛...即使通訊:環信、融云、阿里百川...推送:小米推送、騰訊推送、百度推送...安全加固:360加固寶、愛加密...

一般情況下,我在選擇是否引入一些開源框架主要基于以下幾個因素:

借助搜索引擎,如果網上有一大波資料,說明使用的人多,出了問題好找解決方案;當然,如果普遍出現差評,就可以直接Pass掉了看框架的作者或團隊,如 JakeWharton大神、Facebook團隊等。大神和大公司出品的框架質量相對較高,可保證后續的維護和bug修復,不容易爛尾;關注開源項目的 commit密度,issue的提交、回復、關閉數量,watch數,start數,fork數等。像那種個基本不怎么提交代碼、提issue又不怎么回復和修復的項目,最好就pass掉;

針對不開源SDK的選擇,也主要基于以下幾點去考慮:

借助搜索引擎,查明口碑;很多第三方SDK的官網首頁都會告訴你,多少應用已經接入了此SDK,如果你看到有不少知名應用在上面,那這個SDK可以考慮嘗試一下了。諸如,友盟官網:

我的 Android 開發實戰經驗總結

接入友盟的App

查看SDK使用文檔、它們的開發者社區、聯系客服。好的SDK,使用文檔肯定會詳細指引你。出了問題,上開發者社區提問,他們的開發工程師也會社區上回答。實在不行只能聯系客服,如果客服的態度都讓你不爽,那就可以考慮換別家的SDK了。

小結:選好 "車輪" ,事半功倍

3.抽象依賴第三方框架

為什么要抽象依賴于第三方框架呢?這里和第1點是互相照應的,就是降低我們對具體某個框架的依賴性,從而方便我們快速切換到不同的框架去。說到這里,你可能覺得很抽象,那我直接舉一個加載圖片的例子好了。

假設你當前為項目引入一個加載圖片的框架 —— Android-Universal-Image-Loader,最簡單的做法就是加入相應的依賴包后,在任何需要加載圖片的地方寫上下面這樣的代碼段。

ImageLoader imageLoader = ImageLoader.getInstance(); // Get singleton instance// Load image, decode it to Bitmap and display Bitmap in ImageView (or any other view // which implements ImageAware interface)imageLoader.displayImage(imageUri, imageView);// Load image, decode it to Bitmap and return Bitmap to callbackimageLoader.loadImage(imageUri, new SimpleImageLoadingListener() { @Override public void onLoadingComplete(String imageUri, View view, Bitmap loadedImage) {// Do whatever you want with Bitmap }});

這種做法最簡單粗暴,但是帶來的問題也最嚴重的。如果我有幾十上百個地方都這么寫,而在某一天,我聽說Facebook出了個神器 Fresco,想要換掉 Android-Universal-Image-Loader ,你就會發現你需要喪心病狂的去改動幾十上百個地方的代碼,不僅工作量大,而且還容易出錯。造成這樣的原因,就在于項目和加載圖片的框架之間形成了強耦合,而實際上,項目本身不應該知道我具體用了哪個加載圖片的框架。

正確的方式,應該是對框架做一個抽象的封裝,以應對未來發生的變化,我直接舉自己的開源項目 AndroidAlbum 中的一種封裝做法好了。

我的 Android 開發實戰經驗總結

AndroidAlbum

大致代碼如下:

//1、聲明 ImageLoaderWrapper 接口,定義一些抽象的加載接口方法public interface ImageLoaderWrapper { /** * 顯示 圖片 * * @param imageView 顯示圖片的ImageView * @param imageFile 圖片文件 * @param option 顯示參數設置 */ public void displayImage(ImageView imageView, File imageFile, DisplayOption option); /** * 顯示圖片 * * @param imageView 顯示圖片的ImageView * @param imageUrl 圖片資源的URL * @param option 顯示參數設置 */ public void displayImage(ImageView imageView, String imageUrl, DisplayOption option); /** * 圖片加載參數 */ public static class DisplayOption {/** * 加載中的資源id */public int loadingResId;/** * 加載失敗的資源id */public int loadErrorResId; }}// 2、將 UniversalAndroidImageLoader 封裝成繼承 ImageLoaderWrapper 接口的 UniversalAndroidImageLoader ,//這里代碼有點長,感興趣可以查看項目源碼中的實現 https://github.com/D-clock/AndroidAlbum// 3、做一個ImageLoaderFactorypublic class ImageLoaderFactory { private static ImageLoaderWrapper sInstance; private ImageLoaderFactory() { } /** * 獲取圖片加載器 * * @return */ public static ImageLoaderWrapper getLoader() {if (sInstance == null) { synchronized (ImageLoaderFactory.class) {if (sInstance == null) { sInstance = new UniversalAndroidImageLoader();//<link>https://github.com/nostra13/Android-Universal-Image-Loader</link>} }}return sInstance; }}//4、在所有需要加載圖片的地方作如下的調用ImageLoaderWrapper loaderWrapper = ImageLoaderFactory.getLoader();ImageLoaderWrapper.DisplayOption displayOption = new ImageLoaderWrapper.DisplayOption();displayOption.loadingResId = R.mipmap.img_default;displayOption.loadErrorResId = R.mipmap.img_error;loaderWrapper.displayImage(imagview, url, displayOption);

這樣一來,切換框架所帶來的代價就會變得很小,這就是不直接依賴于框架所帶來的好處。當然,以上只是我比較簡單的封裝,你也可以進行更加細致的處理。

小結:預留變更,不強耦合于第三方框架

4.從 MVC 到 MVP

說實話,在沒接觸 MVP 的架構之前,一直都是使用 MVC 的模式進行開發。而隨著項目越來越大,Activity或者 Fragment里面代碼越來越臃腫,看的時候想吐,改的時候想屎...這里撇開其他各種各樣的架構不談,只對比MVC 和 MVP 。

我的 Android 開發實戰經驗總結

MVC

View:布局的xml文件Controller:Activity、Fragment、Dialog等Model:相關的業務操作處理數據(如對數據庫的操作、對網絡等的操作都應該在Model層里)

你會發現,如果 View 層只包含了xml文件,那我們 Android 項目中對 View 層可做操作的程度并不大,頂多就是用include復用一下布局。而 Activity 等簡直就是一個奇葩,它雖然歸屬于 Controller 層,但實際上也干著 View 層的活(View 的初始化和相關操作都是在Activity中)。就是這種既是 View 又是 Controller 的結構,違背了單一責任原則,也使得 Activity 等出現了上述的臃腫問題。

我的 Android 開發實戰經驗總結

MVP
標簽: Android
相關文章:
日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区
国产91精品对白在线播放| 国产精品xxx在线观看| 荡女精品导航| 国产精品流白浆在线观看| 国产精品.xx视频.xxtv| 免费一级欧美片在线观看网站| 国产乱人伦精品一区| 久久精品国产亚洲aⅴ| 精品理论电影在线| 黄色在线观看www| 欧美成人基地 | 日韩视频一二区| 日韩毛片一区| 国产精品v一区二区三区| 精品一区二区三区的国产在线观看| 久久99精品久久久野外观看| 精品视频高潮| 日韩成人亚洲| 欧美在线网站| 亚洲精品大全| 久久国内精品视频| 国产一区二区三区久久| 91精品国产福利在线观看麻豆| 亚洲国产专区校园欧美| 蜜桃视频第一区免费观看| 日本91福利区| 精品国产精品久久一区免费式| 色偷偷色偷偷色偷偷在线视频| 一区二区三区四区在线看| 视频一区欧美日韩| 国产精品视频一区二区三区四蜜臂| 水蜜桃精品av一区二区| 欧美1区免费| 91伊人久久| 欧美片第1页| 综合精品一区| 免费亚洲婷婷| 精品日韩毛片| 蜜臀av一区二区在线免费观看| 国产精品尤物| 99精品视频在线| 青草国产精品| 久久免费高清| 欧美一级久久| 国产字幕视频一区二区| 日本午夜精品久久久久| 欧产日产国产精品视频| 亚洲精品无吗| 国产伦久视频在线观看| 综合国产在线| 日本免费一区二区三区四区| 人人爽香蕉精品| 国产精品毛片一区二区在线看| 国产午夜久久| 精品视频一区二区三区在线观看| 午夜久久久久| 久久不见久久见国语| 欧美日韩国产高清电影| 91亚洲无吗| 久久三级视频| 国产欧美日韩在线一区二区 | 99久久精品费精品国产| 亚洲精品影视| 日韩深夜视频| 天堂精品久久久久| 久久精品卡一| 久久中文精品| 一区二区三区国产盗摄| 国产精品xx| 日韩成人午夜精品| 欧美色图一区| 久久在线91| 五月国产精品| 九九久久电影| 国模精品一区| 欧美综合社区国产| 久久国产成人| 日本久久成人网| 国产日韩一区二区三区在线播放| 不卡在线一区| 成人国产精品久久| 日韩国产高清在线| 国产手机视频一区二区| 日韩电影二区| 欧美极品一区二区三区| 亚洲精品黄色| 蜜桃一区二区三区| 国产suv精品一区二区四区视频| 日本在线不卡视频| 亚洲综合欧美| 国产在线欧美| 91免费精品| 国产香蕉精品| 亚洲精品裸体| 中国女人久久久| 亚洲午夜久久久久久尤物| 精品91福利视频| 国产欧美日韩亚洲一区二区三区| 免费在线观看视频一区| 五月婷婷六月综合| 欧美中文字幕一区二区| 欧美aa在线观看| 色爱综合网欧美| 久久这里只有| 国产精品1luya在线播放| 日本精品另类| 日韩三级精品| 欧美在线首页| 久久国产麻豆精品| 日韩精品91亚洲二区在线观看| 亚洲精品美女91| 日本成人精品| 亚洲精品乱码日韩| 亚洲精品第一| 日韩精品久久理论片| 亚洲精品第一| 日韩精品a在线观看91| 日本a级不卡| 国产探花一区在线观看| 欧美日韩午夜电影网| 欧美精品中文字幕亚洲专区| 日韩二区在线观看| 国产精品亚洲综合色区韩国| 国产精品久久乐| 欧美精品不卡| 麻豆极品一区二区三区| 加勒比视频一区| 五月激情久久| 韩日一区二区三区| 日韩精品一区第一页| 日本大胆欧美人术艺术动态| 亚洲精品婷婷| 国产欧美日韩一区二区三区在线| 国产极品久久久久久久久波多结野| 国产精品17p| 久久uomeier| 尤物tv在线精品| 久久av在线| 欧美一区二区三区久久| 国产精品一区二区美女视频免费看 | 久久在线免费| 亚洲男女自偷自拍| 日本不卡一区二区三区| 国产欧美日韩亚洲一区二区三区| 精品国产a一区二区三区v免费| 亚洲欧洲美洲av| 日韩天堂av| 日本视频在线一区| 国产欧美日韩精品一区二区三区| 国产精品99久久免费观看| 国内自拍视频一区二区三区| se01亚洲视频| 国产精品婷婷| 国产日韩一区二区三免费高清| 成人国产精品久久| 亚洲黄页一区| 久久国产免费看| 日本一区二区免费高清| 好吊日精品视频| 久久精品 人人爱| 欧美日韩视频网站| 蜜桃一区二区三区在线观看| 国产欧美日韩免费观看| 欧美成a人国产精品高清乱码在线观看片在线观看久 | 欧美日一区二区三区在线观看国产免 | 亚洲一区欧美| 精品资源在线| 亚洲尤物在线| 国产图片一区| 99久久夜色精品国产亚洲1000部| 老司机精品久久| 精品国产一级| 老鸭窝毛片一区二区三区| 美女性感视频久久| 九一国产精品| 欧美一区二区三区免费看| 欧美日韩精品免费观看视欧美高清免费大片 | 亚洲先锋成人| 日本欧美在线| 日韩和的一区二在线| 日韩中文字幕无砖| 蜜桃av.网站在线观看| 亚洲人成在线影院| 欧美极品中文字幕| 亚洲一级在线| 久久久久久婷| 综合国产视频| 亚洲www免费| 日韩精品欧美大片| 色爱av综合网| 国产精品调教视频| 中文在线不卡| 久久久久免费| 欧美久久精品| 久久午夜精品一区二区| 97国产精品| 久久国际精品| 视频一区中文字幕| 欧美www视频在线观看| 日韩精品乱码av一区二区|