1. 说明
在我们开发项目中一定会写 handler,并且handler的写法也有很多种,下边是handler比较标准的一种写法,而且不会内存泄露,是避免handler造成内存泄露的一种比较好的写法,代码如下:
public class SplashActivity extends AppCompatActivity {
MyHandler myHandler;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_splash);
myHandler = new MyHandler(this);
myHandler.postDelayed(new Runnable() {
@Override
public void run() {
initJump();
}
}, 2000);
}
private void initJump() {
//指纹高优先级
if (PreferenceCache.getFingerFlg()){
//指纹已开启
Intent intent = new Intent(SplashActivity.this,VerifyFingerActivity.class);
startActivity(intent);
finish();
return;
}
if (PreferenceCache.getGestureFlag()){
Intent intent = new Intent(getApplicationContext(),ClosePatternPswActivity.class);
//等于3为认证成功
intent.putExtra("gestureFlg",3);
startActivity(intent);
finish();
return;
}
startActivity(new Intent(getApplicationContext(), MainActivity.class));
finish();
}
static class MyHandler extends Handler {
private final WeakReference<SplashActivity> mActivty;
public MyHandler(SplashActivity activity){
mActivty =new WeakReference<SplashActivity>(activity);
}
@Override
public void handleMessage(Message msg) {
super.handleMessage(msg);
}
}
@Override
protected void onDestroy() {
super.onDestroy();
if(myHandler != null){
myHandler.removeCallbacksAndMessages(null);
myHandler = null;
}
}
@Override
public void onBackPressed() {
super.onBackPressed();
}
}
分析以上代码可知:
上边的MyHandler 的构造方法中持有该Activity用的是弱引用,同时在 onDestroy()方法中调用removeCallbacksAndMessages(null);移除所有消息,并且将MyHandler 置为null,以上写法可以最大限度的避免 由handler造成的 内存泄露。