Android性能優化以內存優化

內存泄漏出現的場景及解決辦法

 內存泄漏是指咱們在向程序申請了內存存儲對象後,當該對象不須要用了的時候又不把內存釋放還給程序,從而引起內存溢出(out of memory),下面例舉一下可能形成內存泄漏的一些場景。web

  1. 靜態集合  咱們的靜態集合中存儲了對象,由於這些對象一直被集合持有,因此對象沒法被回收,特別是集合中對象愈來愈多的時候越容易OOM。
  • 示例:
static List<Object> list = new ArrayList<>();

        for (int i = 0; i < 10; i++) {
            Object o = new Object();
            list.add(o);
        }
複製代碼
  • 解決辦法:數據庫

    將list清空,而且置爲nullapi

list .clear();
        list = null;
複製代碼
  1. static修飾的成員變量  static修飾的成員變量其實與上面的靜態集合道理差很少,都是因爲引用被靜態持有,致使其生命週期與靜態生命週期相等了
  • 示例:
private static Context mContext;
   private void get(Context context) {
        this.mContext = context;
    }
複製代碼
  • 解決辦法:  1. Context調用ApplicationContext
private static Context mContext;
    private void get(Context context) {
        this.mContext = context.getApplicationContext();
    }
複製代碼

 2. 使用弱引用關聯,當內存不足時,gc會將弱引用給回收緩存

private static WeakReference<Activity> mActivity;
    private void get(Activity activity) {
        this.mActivity = new WeakReference<Activity>(activity);
    }
複製代碼
  1. 非靜態內部類或匿名類  非靜態內部類或匿名類都會隱性持有外部類引用
private static test t=null;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_doc_main);

        if (t == null) {
            t = new test();
        }
    }

    private class test{
        private void test(){
        }
    }
複製代碼
  • 解決辦法: 將非靜態內部類轉成靜態內部類,這樣就不會持有外部對象的引用了
  1. 資源對象使用後未關閉  咱們平時在使用使用一些數據庫,流,bitmap,廣播等等時,咱們都須要在不須要用的時候及時的關閉,否則對象就會一直佔着內存,沒法回收掉,記住一個點,有開就有關bash

  2. Handler消息傳遞  關於handler消息傳遞引起的內存泄漏有兩個地方,第一,非靜態內部類,第二,Handler持有外部對象的引用網絡

  • 解決辦法:   第一種 第一點:這一點咱們上面說過了解決辦法,將handler設置爲靜態內部類便可; 第二點:咱們有時候可能須要從handler的構造中將上下文傳遞過去,這樣就持有了外部對象的引用了,這時候咱們能夠用弱引用關聯上下文,避免內存泄漏  第二種 在退出的時候將handler中的消息隊列清空,結束handler生命週期
mHandler.removeCallbacksAndMessages(null);
複製代碼
  1. 內存泄漏的其餘場景  咱們經常使用的listview,使用用ViewHolder來複用對象,避免由於條目過多的時候由於重複的建立對象而形成大量的內存佔用現象。  webview致使的內存泄漏,咱們能夠從清除綁定的服務,清除緩存,清除view,再退出這幾個方面來進行
if( mWebView!=null) {
        ViewParent parent = mWebView.getParent();
        if (parent != null) {
            ((ViewGroup) parent).removeView(mWebView);
        }
        mWebView.stopLoading();
        mWebView.getSettings().setJavaScriptEnabled(false);
        mWebView.clearHistory();
        mWebView.clearView();
        mWebView.removeAllViews();
        mWebView.destroy();

    }
複製代碼

 還有一些就是咱們平時要注意context的使用了,要注意他的使用場景與生命週期ide

Bitmap優化

 Android的bitmap優化能夠從四個方面入手優化

  1. 及時釋放資源  當咱們使用完bitmap的時候及時釋放資源,避免資源佔用
  • api10以前直接調用Bitmap.recycle()進行釋放,
  • api10以後採用軟引用的方式 2.根據分辨率適配圖片或者縮放裁剪圖片
  • 設置多套分辨率的圖片,將其放在不一樣分辨率的文件夾中
  • 縮放或者裁剪圖片這個要根據需求來進行,若是需求容許的狀況下能夠採用這種方式BitmapFactory.decodeResource()
  • 加載大圖的時候咱們能夠採用inJustDecodeBounds / inSmapleSize來實現;參考連接淺談BitmapFactory.Options 3.根據需求來設置圖片編碼
  • bitmap有四種解碼方式,ALPHA_8,RGB_565,ARGB-4444,ARGB_8888(默認)位數越高,越清晰,咱們能夠根據實際需求來對bitmap用inperferredConfig設置編碼方式 4.設置圖片三級緩存
  • 給bitmap設置三級緩存,內存-本地-網絡
相關文章
相關標籤/搜索