首页 > 研究了一下腾讯信鸽的demo,感觉里面一个自定义handler类有问题

研究了一下腾讯信鸽的demo,感觉里面一个自定义handler类有问题

这是该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的做法是不妥当的

【热门文章】
【热门文章】