標籤:android 應用
Android提供的AsyncTask,但事實上AsyncTask的問題更加嚴重,Thread只有在run函數不結束時才出現這種記憶體泄露問題,然而AsyncTask內部的實現機制是運用了 ThreadPoolExcutor,該類產生的Thread對象的生命週期是不確定的,是應用程式無法控制的,因此如果AsyncTask作為Activity的內部類,就更容易出現記憶體泄露的問題。
一般的應用都是從伺服器擷取資料,然後通過極致的介面風格,將資料清晰,明朗的展現給使用者。
那麼就可以分為這兩塊:
1.介面UI 追求極致
2.功能
2.1擷取資料:主要是與伺服器通訊,那麼就要涉及到網路編程 :
2.1.1 URlConnection
2.1.2 HttpURLConnection(post get)
2.1.3 Socket
2.1.4 HttpClient(post get)
2.1.5 WebService(自己拼裝請求xml 資料,採用開源jar包 ksoap-android-)
2.2網路通訊的時候,採用的非同步資料擷取
2.2.1 AsynTask android 封裝好的非同步資料擷取,包括三個方法
doInBackground 執行在子線程中的非同步方法呼叫
onProgressUpdate 資料擷取之後 執行的方法,在主線程中可以在這裡更新UI介面
onPostExecute 非同步方法呼叫執行前,可以進行介面友好提示 在主線程中執行的方法
2.2.2 自己封裝一個任務類(子線程)thread 採用線程池 這裡需要自己維護一個工作清單,並且做到任務的優先順序
2.3 android最佳化 最常見的就是listview 的大資料最佳化 圖片最佳化 訪問網路的最佳化
2.3.1 最佳化的原則: 資料消極式載入 分批載入 本機快取
2.3.2 listview 資料最佳化 複用contentview
建立static class ViewHolder
分批載入 滑動監聽 或者按鈕 顯示更多資料 往下拖動 顯示
2.3.3 listview 圖片最佳化 非同步載入
本機快取(二級緩衝 記憶體(軟引用實現),sd卡)
快速滑動時不顯示圖片
分為核心線程池和普通線程池,下載圖片等耗時任務放置在普通線程池
2.3.4 超級大胖子Bitmap
及時的銷毀(Activity的onDestroy時將bitmap回收,
在被UI組件使用後馬上進行回收會拋RuntimeException:
Canvas:tryingtousearecycledbitmapandroid.graphics.Bitmap)
設定一定的採樣率(有開發人員提供的圖片無需進行採樣,
對於有使用者上傳或第三方的大小不可控圖片,可進行採樣減少圖片所佔的記憶體),
從服務端返回圖片,建議同時反饋圖片的size巧妙的運用軟引用drawable對應resid的資源,
bitmap對應其他資源任何類型的圖片,如果擷取不到(例如檔案不存在,或者讀取檔案時跑OutOfMemory異常),
應該有對應的預設圖片(預設圖片放在在apk中,通過resid擷取);
2.3.5 Drawable
ui組件需要用到的圖片是apk包內建的,、
那麼一律用setImageResource或者setBackgroundResource,而不要根據resourceid
注意:get(getResources(),R.drawable.btn_achievement_normal)該方法通過resid轉換為drawable,
需要考慮回收的問題,如果drawable是對象私人對象,在對象銷毀前是肯定不會釋放記憶體的。
2.3.6 訪問網路最佳化
設定逾時時間,採用壓縮流 傳送資料
2.3.7 記憶體最佳化,static是Java中的一個關鍵字,當用它來修飾成員變數時,那麼該變數就屬於該類,而不是該類的執行個體。所以用static修飾的變數,它的生命週期是很長的。
最佳化方法:在一個工程中集中管理這些靜態常量
盡量避免static成員變數的使用,
使用SoftReference或者WeakReference代替強引用
盡量避免在一個activity裡面寫線程內部類:
線程是Activity的內部類,所以Thread中儲存了Activity的一個引用,當run函數沒有結束時,Thread是不會被銷毀的,
因此它所引用的老的Activity也不會被銷毀,當這些activity載入了很多資源,沒有釋放也就很容易出現了記憶體泄露
的問題。
Android提供的AsyncTask,但事實上AsyncTask的問題更加嚴重,Thread只有在run函數不結束時才出現這種記憶體泄露問題,然而AsyncTask內部的實現機制是運用了
ThreadPoolExcutor,該類產生的Thread對象的生命週期是不確定的,是應用程式無法控制的,
因此如果AsyncTask作為Activity的內部類,就更容易出現記憶體泄露的問題。
那麼就自己寫一個線程類,管理這些任務。
著作權聲明:本文為博主原創文章,未經博主允許不得轉載。
Android開發中網路編程與常見功能最佳化總結