oom(4)LeakCanary和eventbus的使用总结

来源:互联网 发布:冰川网络客服 编辑:程序博客网 时间:2024/06/10 01:33

参考链接: http://www.jianshu.com/p/0049e9b344b0

参考链接: https://corner.squareup.com/2015/05/leak-canary.html

参考1:http://www.cnblogs.com/androidsuperman/p/0bdb7806bd5ff9c3edbdef9a913eae6f.html

参考2:http://m.blog.csdn.net/article/details?id=50521600

eclispe版LeakCanary下载:http://download.csdn.net/detail/liudehuaii18/8756841

android studio版 LeakCanary下载:https://github.com/liaohuqiu/leakcanary-demo

中文文档:http://www.liaohuqiu.net/cn/posts/leak-canary-read-me/

Why:http://www.liaohuqiu.net/cn/posts/leak-canary/


bitmap直接放到内存也可能直接引起OOM,这时候我们就不能说是内存泄露导致的OOM了,常见的引起OOM的原因大概有以下几种:

1,bitmap太大或者bitmap用完没有回收   

2,数据库的cursor没有关闭  

3.构造adapter时,没有使用缓存contentview

4,死循环或者递归

除此之外,还有下面错误示例:

 这是一个简单的sharedPreferences的单例工具类片段,其中需要一个上下文,如果这在某个activity类里调用了这个类SaveDate.getInstence(this)后就会把这个Activity对象
传过来,然后一般我们不用这个Activity以后就直接finish了,但是因为一个静态的对象SAVEDATE一直占用着这个Activity对象,所以GC也就无法回收这个对象,那么很显然
你这个Activity对象就叫做内存泄露了,怎么样?想想你在程序中有没有这么写过,那么正确的做法是SaveDate.getInstence(this.getApplication())这样调用,因为Aplication
对象的是整个应用的上下文,生命周期是最长的不用担心它泄露,所以在能使用getApplication()的地方我们就不要用Activity做上下文,当然也有很多地方时不能传
getApplication()的,那我们就要自己去控制这个对象的生命周期了

public classSaveDate {private static SaveDate SAVEDATE;//上下文privateContextcon;static SharedPreferencessharedPreferences;private SaveDate(Context con) {this.con= con;} /*** * 得到一个单例对象***/public staticSaveDate getInstence(Context con) {if (SAVEDATE==null) {SAVEDATE = new SaveDate(con);}if (sharedPreferences==null) {sharedPreferences = con.getSharedPreferences("saveDate", Context.MODE_WORLD_WRITEABLE);}return SAVEDATE;}}

使用eventbus传递消息,是可以避免一些自己代码中的内存泄漏,使用方法

参见:http://blog.csdn.net/harvic880925/article/details/40660137

public class MainActivity extends Activity {Button btn;TextView tv;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);EventBus.getDefault().register(this);btn = (Button) findViewById(R.id.btn_try);tv = (TextView)findViewById(R.id.tv); btn.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {// TODO Auto-generated method stubIntent intent = new Intent(getApplicationContext(),SecondActivity.class);startActivity(intent);}});}public void onEventMainThread(FirstEvent event) {String msg = "onEventMainThread收到了消息:" + event.getMsg();Log.d("harvic", msg);tv.setText(msg);Toast.makeText(this, msg, Toast.LENGTH_LONG).show();}@Overrideprotected void onDestroy(){super.onDestroy();EventBus.getDefault().unregister(this);}}
public class SecondActivity extends Activity {private Button btn_FirstEvent;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_second);btn_FirstEvent = (Button) findViewById(R.id.btn_first_event);btn_FirstEvent.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {// TODO Auto-generated method stubEventBus.getDefault().post(new FirstEvent("FirstEvent btn clicked"));}});}}

public class FirstEvent {private String mMsg;public FirstEvent(String msg) {// TODO Auto-generated constructor stubmMsg = msg;}public String getMsg(){return mMsg;}}



0 0
原创粉丝点击