这是该handler的代码
private static class HandlerExtension extends Handler {
WeakReference<MainActivity> mActivity;
HandlerExtension(MainActivity activity) {
mActivity = new WeakReference<MainActivity>(activity);
}
@Override
public void handleMessage(Message msg) {
super.handleMessage(msg);
MainActivity theActivity = mActivity.get();
if (theActivity == null) {
theActivity = new MainActivity();
}
if (msg != null) {
Log.w(Constants.LogTag, msg.obj.toString());
TextView textView = (TextView) theActivity
.findViewById(R.id.deviceToken);
textView.setText(XGPushConfig.getToken(theActivity));
}
// XGPushManager.registerCustomNotification(theActivity,
// "BACKSTREET", "BOYS", System.currentTimeMillis() + 5000, 0);
}
}
注意handleMessage方法里,
if (theActivity == null) {
theActivity = new MainActivity();
}
这样的用法明显不对啊,Activity实例是系统调用生成的,手动new没有任何作用,各个生命周期方法(onCreate等)也不会被调用。既然theActivity == null,那多半就意味着这个Activity已经被用户正常关闭,也没有必要再使用它了。
注意看:
private static class HandlerExtension extends Handler {
这个内部类有static修饰,因此并依赖外部类的实例,也就是说HandlerExtension的生命周期与外部类是独立的。而你说的mActivity又是弱引用的:
WeakReference<MainActivity> mActivity;
所以系统GC的时候,这个MainActivity就可能被释放掉了,那么这个HandlerExtension中,如果不判断,则很大可能是null。
theActivity == null也有可能是GC回收掉的
不过除非它MainActivity的构造函数里做了特别的处理,
否则这种判断为空后直接new activity的做法是不妥当的