安卓常見引起記憶體流失的五種情況

來源:互聯網
上載者:User

標籤:std   syn   process   single   mil   return   sample   err   kill   

 1,單例引起的記憶體流失----解決辦法 將context生命週期和application保持一致

public class SingletonAppliationContext {
    private static SingletonAppliationContext instance;
    private Context context;
    private SingletonAppliationContext(Context context) {
        this.context = context.getApplicationContext();// 使用Application 的context
    }
    public static SingletonAppliationContext getInstance(Context context) {
        if (instance == null) {
            instance = new SingletonAppliationContext(context);
        }
        return instance;
    }
}

 

2.非靜態內部類建立靜態執行個體造成的記憶體流失 解決辦法將內部類noneStaticClass 設定為static
public class StaticLeakActivity extends Activity {
    private static noneStaticClass mResource = null;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        if (mResource == null) {
            mResource = new noneStaticClass();
        }
    }
    private static class noneStaticClass {
    }
}

 

3.handler造成記憶體流失 handler、Message、MessageQueue  TLS(生命週期不一致)

53610654
/**
 * 解決辦法:
 * 1.將 Handler 聲明為靜態
 * 2.通過弱引用的方式引入 Activity
 */

public class SampleActivity extends Activity {

  /**

   * Instances of static inner classes do not hold an implicit

   * reference to their outer class.

   */

  private static class MyHandler extends Handler {

    private final WeakReference<SampleActivity> mActivity;

    public MyHandler(SampleActivity activity) {

      mActivity = new WeakReference<SampleActivity>(activity);

    }

    @Override

    public void handleMessage(Message msg) {

      SampleActivity activity = mActivity.get();

      if (activity != null) {

        // ...

      }

    }

  }

 

  private final MyHandler mHandler = new MyHandler(this);

 

  /**

   * Instances of anonymous classes do not hold an implicit

   * reference to their outer class when they are "static".

   */

  private static final Runnable sRunnable = new Runnable() {

      @Override

      public void run() { /* ... */ }

  };

  @Override

  protected void onCreate(Bundle savedInstanceState) {

    super.onCreate(savedInstanceState);

    // Post a message and delay its execution for 10 minutes.

    mHandler.postDelayed(sRunnable, 1000 * 60 * 10);

 

    // Go back to the previous Activity.

    finish();

  }

}

 

4,線程造成的記憶體流失 解決辦法

/**
 * 解決辦法:
 * 1.將 MyAsyncTask  MyRunnable

聲明為靜態
 * 2.通過弱引用的方式引入 Activity
 */

 

5.Webview造成的記憶體流失

public class WebviewLeakActivity extends AppCompatActivity {
    private WebView mWebView;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        mWebView = (WebView) findViewById(R.id.wv_show);
        mWebView.loadUrl("http://www.baidu.com");
    }

// 解決辦法
    @Override
    protected void onDestroy() {
        destroyWebView();
        android.os.Process.killProcess(android.os.Process.myPid());
        super.onDestroy();
    }

    private void destroyWebView() {
        if (mWebView != null) {
            mWebView.pauseTimers();
            mWebView.removeAllViews();
            mWebView.destroy();
            mWebView = null;
        }
    }

}

 

安卓常見引起記憶體流失的五種情況

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在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.