<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                ThinkChat2.0新版上線,更智能更精彩,支持會話、畫圖、視頻、閱讀、搜索等,送10W Token,即刻開啟你的AI之旅 廣告
                #### 15.1.3 內存泄露優化 內存泄露在開發過程中是一個需要重視的問題,但是由于內存泄露問題對開發人員的經驗和開發意識有較高的要求,因此這也是開發人員最容易犯的錯誤之一。內存泄露的優化分為兩個方面,一方面是在開發過程中避免寫出有內存泄露的代碼,另一方面是通過一些分析工具比如MAT來找出潛在的內存泄露繼而解決。本節主要介紹一些常見的內存泄露的例子,通過這些例子讀者可以很好地理解內存泄露的發生場景并積累規避內存泄露的經驗。關于如何通過工具分析內存泄露將在15.2節中專門介紹。 * 場景1:靜態變量導致的內存泄露 下面這種情形是一種最簡單的內存泄露,相信讀者都不會這么干,下面的代碼將導致Activity無法正常銷毀,因此靜態變量sContext引用了它。 public class MainActivity extends Activity { private static final String TAG = "MainActivity"; private static Context sContext; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); sContext = this; } } 上面的代碼也可以改造一下,如下所示。sView是一個靜態變量,它內部持有了當前Activity,所以Activity仍然無法釋放,估計讀者也都明白。 public class MainActivity extends Activity { private static final String TAG = "MainActivity"; private static View sView; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); sView = new View(this); } } * 場景2:單例模式導致的內存泄露 靜態變量導致的內存泄露都太過于明顯,相信讀者都不會犯這種錯誤,而單例模式所帶來的內存泄露是我們容易忽視的,如下所示。首先提供一個單例模式的TestManager, TestManager可以接收外部的注冊并將外部的監聽器存儲起來。 public class TestManager { private List<OnDataArrivedListener> mOnDataArrivedListeners = new ArrayList<OnDataArrivedListener>(); private static class SingletonHolder { public static final TestManager INSTANCE = new TestManager(); } private TestManager() { } public static TestManager getInstance() { return SingletonHolder.INSTANCE; } public synchronized void registerListener(OnDataArrivedListener listener) { if (! mOnDataArrivedListeners.contains(listener)) { mOnDataArrivedListeners.add(listener); } } public synchronized void unregisterListener(OnDataArrivedListener listener) { mOnDataArrivedListeners.remove(listener); } public interface OnDataArrivedListener { public void onDataArrived(Object data); } } 接著再讓Activity實現OnDataArrivedListener接口并向TestManager注冊監聽,如下所示。下面的代碼由于缺少解注冊的操作所以會引起內存泄露,泄露的原因是Activity的對象被單例模式的TestManager所持有,而單例模式的特點是其生命周期和Application保持一致,因此Activity對象無法被及時釋放。 protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); TestManager.getInstance().registerListener(this); } * 場景3:屬性動畫導致的內存泄露 從Android 3.0開始,Google提供了屬性動畫,屬性動畫中有一類無限循環的動畫,如果在Activity中播放此類動畫且沒有在onDestroy中去停止動畫,那么動畫會一直播放下去,盡管已經無法在界面上看到動畫效果了,并且這個時候Activity的View會被動畫持有,而View又持有了Activity,最終Activity無法釋放。下面的動畫是無限動畫,會泄露當前Activity,解決方法是在Activity的onDestroy中調用animator.cancel()來停止動畫。 protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); mButton = (Button) findViewById(R.id.button1); ObjectAnimator animator = ObjectAnimator.ofFloat(mButton, "rotation", 0, 360).setDuration(2000); animator.setRepeatCount(ValueAnimator.INFINITE); animator.start(); //animator.cancel(); }
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看