Android開(kāi)發(fā)中網(wǎng)絡(luò)編程與常見(jiàn)功能優(yōu)化總結(jié)
作者:佚名
Android提供的AsyncTask,但事實(shí)上AsyncTask的問(wèn)題更加嚴(yán)重,Thread只有在run函數(shù)不結(jié)束時(shí)才出現(xiàn)這種內(nèi)存泄露問(wèn)題,然而AsyncTask內(nèi)部的實(shí)現(xiàn)機(jī)制是運(yùn)用了
ThreadPoolExcutor,該類產(chǎn)生的Thread對(duì)象的生命周期是不確定的,是應(yīng)用程序無(wú)法控制的,
因此如果AsyncTask作為Activity的內(nèi)部類,就更容易出現(xiàn)內(nèi)存泄露的問(wèn)題。
一般的應(yīng)用都是從服務(wù)器獲取數(shù)據(jù),然后通過(guò)極致的界面風(fēng)格,將數(shù)據(jù)清晰,明朗的展現(xiàn)給用戶。
那么就可以分為這兩塊:
1.界面UI 追求極致
那么就可以分為這兩塊:
1.界面UI 追求極致
2.功能
2.1獲取數(shù)據(jù):主要是與服務(wù)器通信,那么就要涉及到網(wǎng)絡(luò)編程 :
2.1.1 URlConnection
2.1.2 HttpURLConnection(post get)
2.1.3 Socket
2.1.4 HttpClient(post get)
2.1.5 WebService(自己拼裝請(qǐng)求xml 數(shù)據(jù),采用開(kāi)源jar包 ksoap-android-)
2.2網(wǎng)絡(luò)通信的時(shí)候,采用的異步數(shù)據(jù)獲取
2.2.1 AsynTask android 封裝好的異步數(shù)據(jù)獲取,包括三個(gè)方法
doInBackground 執(zhí)行在子線程中的異步方法
onProgressUpdate 數(shù)據(jù)獲取之后 執(zhí)行的方法,在主線程中可以在這里更新UI界面
onPostExecute 異步方法執(zhí)行前,可以進(jìn)行界面友好提示 在主線程中執(zhí)行的方法
2.2.2 自己封裝一個(gè)任務(wù)類(子線程)thread 采用線程池 這里需要自己維護(hù)一個(gè)任務(wù)列表,并且做到任務(wù)的優(yōu)先級(jí)
2.3 android優(yōu)化 最常見(jiàn)的就是listview 的大數(shù)據(jù)優(yōu)化 圖片優(yōu)化 訪問(wèn)網(wǎng)絡(luò)的優(yōu)化
2.3.1 優(yōu)化的原則: 數(shù)據(jù)延遲加載 分批加載 本地緩存
2.3.2 listview 數(shù)據(jù)優(yōu)化 復(fù)用contentview
創(chuàng)建static class ViewHolder
分批加載 滑動(dòng)監(jiān)聽(tīng) 或者按鈕 顯示更多數(shù)據(jù) 往下拖動(dòng) 顯示
2.3.3 listview 圖片優(yōu)化 異步加載
本地緩存(二級(jí)緩存 內(nèi)存(軟引用實(shí)現(xiàn)),sd卡)
快速滑動(dòng)時(shí)不顯示圖片
分為核心線程池和普通線程池,下載圖片等耗時(shí)任務(wù)放置在普通線程池
2.3.4 超級(jí)大胖子Bitmap
及時(shí)的銷毀(Activity的onDestroy時(shí)將bitmap回收,
在被UI組件使用后馬上進(jìn)行回收會(huì)拋RuntimeException:
Canvas:tryingtousearecycledbitmapandroid.graphics.Bitmap)
設(shè)置一定的采樣率(有開(kāi)發(fā)者提供的圖片無(wú)需進(jìn)行采樣,
對(duì)于有用戶上傳或第三方的大小不可控圖片,可進(jìn)行采樣減少圖片所占的內(nèi)存),
從服務(wù)端返回圖片,建議同時(shí)反饋圖片的size巧妙的運(yùn)用軟引用drawable對(duì)應(yīng)resid的資源,
bitmap對(duì)應(yīng)其他資源任何類型的圖片,如果獲取不到(例如文件不存在,或者讀取文件時(shí)跑OutOfMemory異常),
應(yīng)該有對(duì)應(yīng)的默認(rèn)圖片(默認(rèn)圖片放在在apk中,通過(guò)resid獲取);
2.3.5 Drawable
ui組件需要用到的圖片是apk包自帶的,、
那么一律用setImageResource或者setBackgroundResource,而不要根據(jù)resourceid
注意:get(getResources(),R.drawable.btn_achievement_normal)該方法通過(guò)resid轉(zhuǎn)換為drawable,
需要考慮回收的問(wèn)題,如果drawable是對(duì)象私有對(duì)象,在對(duì)象銷毀前是肯定不會(huì)釋放內(nèi)存的。
2.3.6 訪問(wèn)網(wǎng)絡(luò)優(yōu)化
設(shè)置超時(shí)時(shí)間,采用壓縮流 傳送數(shù)據(jù)
2.1獲取數(shù)據(jù):主要是與服務(wù)器通信,那么就要涉及到網(wǎng)絡(luò)編程 :
2.1.1 URlConnection
2.1.2 HttpURLConnection(post get)
2.1.3 Socket
2.1.4 HttpClient(post get)
2.1.5 WebService(自己拼裝請(qǐng)求xml 數(shù)據(jù),采用開(kāi)源jar包 ksoap-android-)
2.2網(wǎng)絡(luò)通信的時(shí)候,采用的異步數(shù)據(jù)獲取
2.2.1 AsynTask android 封裝好的異步數(shù)據(jù)獲取,包括三個(gè)方法
doInBackground 執(zhí)行在子線程中的異步方法
onProgressUpdate 數(shù)據(jù)獲取之后 執(zhí)行的方法,在主線程中可以在這里更新UI界面
onPostExecute 異步方法執(zhí)行前,可以進(jìn)行界面友好提示 在主線程中執(zhí)行的方法
2.2.2 自己封裝一個(gè)任務(wù)類(子線程)thread 采用線程池 這里需要自己維護(hù)一個(gè)任務(wù)列表,并且做到任務(wù)的優(yōu)先級(jí)
2.3 android優(yōu)化 最常見(jiàn)的就是listview 的大數(shù)據(jù)優(yōu)化 圖片優(yōu)化 訪問(wèn)網(wǎng)絡(luò)的優(yōu)化
2.3.1 優(yōu)化的原則: 數(shù)據(jù)延遲加載 分批加載 本地緩存
2.3.2 listview 數(shù)據(jù)優(yōu)化 復(fù)用contentview
創(chuàng)建static class ViewHolder
分批加載 滑動(dòng)監(jiān)聽(tīng) 或者按鈕 顯示更多數(shù)據(jù) 往下拖動(dòng) 顯示
2.3.3 listview 圖片優(yōu)化 異步加載
本地緩存(二級(jí)緩存 內(nèi)存(軟引用實(shí)現(xiàn)),sd卡)
快速滑動(dòng)時(shí)不顯示圖片
分為核心線程池和普通線程池,下載圖片等耗時(shí)任務(wù)放置在普通線程池
2.3.4 超級(jí)大胖子Bitmap
及時(shí)的銷毀(Activity的onDestroy時(shí)將bitmap回收,
在被UI組件使用后馬上進(jìn)行回收會(huì)拋RuntimeException:
Canvas:tryingtousearecycledbitmapandroid.graphics.Bitmap)
設(shè)置一定的采樣率(有開(kāi)發(fā)者提供的圖片無(wú)需進(jìn)行采樣,
對(duì)于有用戶上傳或第三方的大小不可控圖片,可進(jìn)行采樣減少圖片所占的內(nèi)存),
從服務(wù)端返回圖片,建議同時(shí)反饋圖片的size巧妙的運(yùn)用軟引用drawable對(duì)應(yīng)resid的資源,
bitmap對(duì)應(yīng)其他資源任何類型的圖片,如果獲取不到(例如文件不存在,或者讀取文件時(shí)跑OutOfMemory異常),
應(yīng)該有對(duì)應(yīng)的默認(rèn)圖片(默認(rèn)圖片放在在apk中,通過(guò)resid獲取);
2.3.5 Drawable
ui組件需要用到的圖片是apk包自帶的,、
那么一律用setImageResource或者setBackgroundResource,而不要根據(jù)resourceid
注意:get(getResources(),R.drawable.btn_achievement_normal)該方法通過(guò)resid轉(zhuǎn)換為drawable,
需要考慮回收的問(wèn)題,如果drawable是對(duì)象私有對(duì)象,在對(duì)象銷毀前是肯定不會(huì)釋放內(nèi)存的。
2.3.6 訪問(wèn)網(wǎng)絡(luò)優(yōu)化
設(shè)置超時(shí)時(shí)間,采用壓縮流 傳送數(shù)據(jù)
2.3.7 內(nèi)存優(yōu)化,static是Java中的一個(gè)關(guān)鍵字,當(dāng)用它來(lái)修飾成員變量時(shí),那么該變量就屬于該類,而不是該類的實(shí)例。所以用static修飾的變量,它的生命周期是很長(zhǎng)的。
優(yōu)化方法:在一個(gè)工程中集中管理這些靜態(tài)常量
盡量避免static成員變量的使用,
使用SoftReference或者WeakReference代替強(qiáng)引用
盡量避免在一個(gè)activity里面寫線程內(nèi)部類:
線程是Activity的內(nèi)部類,所以Thread中保存了Activity的一個(gè)引用,當(dāng)run函數(shù)沒(méi)有結(jié)束時(shí),Thread是不會(huì)被銷毀的,
因此它所引用的老的Activity也不會(huì)被銷毀,當(dāng)這些activity加載了很多資源,沒(méi)有釋放也就很容易出現(xiàn)了內(nèi)存泄露
的問(wèn)題。
Android提供的AsyncTask,但事實(shí)上AsyncTask的問(wèn)題更加嚴(yán)重,Thread只有在run函數(shù)不結(jié)束時(shí)才出現(xiàn)這種內(nèi)存泄露問(wèn)題,然而AsyncTask內(nèi)部的實(shí)現(xiàn)機(jī)制是運(yùn)用了
ThreadPoolExcutor,該類產(chǎn)生的Thread對(duì)象的生命周期是不確定的,是應(yīng)用程序無(wú)法控制的,
因此如果AsyncTask作為Activity的內(nèi)部類,就更容易出現(xiàn)內(nèi)存泄露的問(wèn)題。
那么就自己寫一個(gè)線程類,管理這些任務(wù)。
優(yōu)化方法:在一個(gè)工程中集中管理這些靜態(tài)常量
盡量避免static成員變量的使用,
使用SoftReference或者WeakReference代替強(qiáng)引用
盡量避免在一個(gè)activity里面寫線程內(nèi)部類:
線程是Activity的內(nèi)部類,所以Thread中保存了Activity的一個(gè)引用,當(dāng)run函數(shù)沒(méi)有結(jié)束時(shí),Thread是不會(huì)被銷毀的,
因此它所引用的老的Activity也不會(huì)被銷毀,當(dāng)這些activity加載了很多資源,沒(méi)有釋放也就很容易出現(xiàn)了內(nèi)存泄露
的問(wèn)題。
Android提供的AsyncTask,但事實(shí)上AsyncTask的問(wèn)題更加嚴(yán)重,Thread只有在run函數(shù)不結(jié)束時(shí)才出現(xiàn)這種內(nèi)存泄露問(wèn)題,然而AsyncTask內(nèi)部的實(shí)現(xiàn)機(jī)制是運(yùn)用了
ThreadPoolExcutor,該類產(chǎn)生的Thread對(duì)象的生命周期是不確定的,是應(yīng)用程序無(wú)法控制的,
因此如果AsyncTask作為Activity的內(nèi)部類,就更容易出現(xiàn)內(nèi)存泄露的問(wèn)題。
那么就自己寫一個(gè)線程類,管理這些任務(wù)。
責(zé)任編輯:閆佳明
來(lái)源:
Android應(yīng)用開(kāi)發(fā) 網(wǎng)絡(luò)編程與常見(jiàn)功能優(yōu)化總結(jié)