Android開發中網路編程與常見功能最佳化總結

來源:互聯網
上載者:User

標籤: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開發中網路編程與常見功能最佳化總結

    聯繫我們

    該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

    如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

    A Free Trial That Lets You Build Big!

    Start building with 50+ products and up to 12 months usage for Elastic Compute Service

    • Sales Support

      1 on 1 presale consultation

    • After-Sales Support

      24/7 Technical Support 6 Free Tickets per Quarter Faster Response

    • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.