看过一些大神分享的文章,吸收一些经验ide
一、处理Handler形成的内存泄露oop
建立一个静态Handler内部类,而后对Handler持有的对象使用弱引用,这样在回收时也能够回收Handler持有的对象,这样虽然避免了Activity泄漏,不过Looper线程的消息队列中仍是可能会有待处理的消息,因此咱们在Activity的Destroy时或者Stop时应该移除消息队列中的消息this
public class MainActivity extends AppCompatActivity {spa
private MyHandler mHandler = new MyHandler(this);线程
private TextView mTextView;orm
private static class MyHandler extends Handler {对象
private WeakReference<Context> reference;生命周期
public MyHandler(Context context) {队列
reference = new WeakReference<>(context);内存
}
@Override
public void handleMessage(Message msg) {
MainActivity activity = (MainActivity) reference.get();
if (activity != null) {
activity.mTextView.setText("");
}
}
}
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mTextView = (TextView) findViewById(R.id.textview);
loadData();
}
private void loadData() {
// ...request
Message message = Message.obtain();
mHandler.sendMessage(message);
}
@Override
protected void onDestroy() {
super.onDestroy();
mHandler.removeCallbacksAndMessages(null);
}
}
二、线程形成的内存泄漏
static class MyAsyncTask extends AsyncTask<Void, Void, Void> {
private WeakReference<Context> weakReference;
public MyAsyncTask(Context context) {
weakReference = new WeakReference<>(context);
}
@Override
protected Void doInBackground(Void... params) {
SystemClock.sleep(10000);
return null;
}
@Override
protected void onPostExecute(Void aVoid) {
super.onPostExecute(aVoid);
MainActivity activity = (MainActivity) weakReference.get();
if (activity != null) {
//...
}
}
}
static class MyRunnable implements Runnable{
@Override
public void run() {
SystemClock.sleep(10000);
}
}
//——————
new Thread(new MyRunnable()).start();
new MyAsyncTask(this).execute();
一些建议
对于生命周期比Activity长的对象若是须要应该使用ApplicationContext
对于须要在静态内部类中使用非静态外部成员变量(如:Context、View ),能够在静态内部类中使用弱引用来引用外部类的变量来避免内存泄漏
对于再也不须要使用的对象,显示的将其赋值为null,好比使用完Bitmap后先调用recycle(),再赋为null
保持对对象生命周期的敏感,特别注意单例、静态对象、全局性集合等的生命周期
对于生命周期比Activity长的内部类对象,而且内部类中使用了外部类的成员变量,能够这样作避免内存泄漏:
将内部类改成静态内部类
静态内部类中使用弱引用来引用外部类的成员变量
在涉及到Context时先考虑ApplicationContext