最近Handler玩嗨了,突发奇想搞一个全局的handler,苦思冥想3三小时,终于搞定!
先在Application中创建Handler和用于回调的接口,并且打印这个接口的地址值(后面测试用)
//Application.class private static Handler mHandler = new Handler(Looper.getMainLooper()) { @Override public void handleMessage(Message msg) { super.handleMessage(msg); mListener.heandleMessage(msg); System.out.println("mListener 地址值==== " + mListener); } }; private static HandlerListener mListener; public static void setOnHandlerListener(HandlerListener listener) { mListener = listener; } public static HandlerListener getListener(){ return mListener; } public interface HandlerListener { void heandleMessage(Message msg); }
在Application中模拟创建子线程发送消息,一般都是在网络请求后发送消息通知Activity修改UI
//Application.class @Override public void onCreate() { super.onCreate(); mContext = this; new Thread() { @Override public void run() { super.run(); for (int i = 0; i < 15; i++) { try { sleep(500); } catch (InterruptedException e) { e.printStackTrace(); } mHandler.sendEmptyMessage(i); } } }.start(); }
在MainActivity中 设置这个监听
//MainActivity.class @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); MyApplication.setOnHandlerListener(new MyApplication.HandlerListener() { @Override public void heandleMessage(Message msg) { System.out.println("MainActivity_msg==== " + msg.what); } }); } //添加一个跳转按钮 mButton = (Button) findViewById(R.id.button); mButton.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { //跳转到 HandlerActivity Intent intent = new Intent(MainActivity.this, HandlerActivity.class); startActivity(intent); } });
循环打印出发出的消息,并且当前的mListener 的地址值,好戏就要开始了!
System.out: MainActivity_msg==== 0 System.out: mListener 地址值==== com.hdjz.mytest.activity.MainActivity$2@22078df System.out: MainActivity_msg==== 1 System.out: mListener 地址值==== com.hdjz.mytest.activity.MainActivity$2@22078df System.out: MainActivity_msg==== 2 System.out: mListener 地址值==== com.hdjz.mytest.activity.MainActivity$2@22078df System.out: MainActivity_msg==== 3 System.out: mListener 地址值==== com.hdjz.mytest.activity.MainActivity$2@22078df System.out: MainActivity_msg==== 4 System.out: mListener 地址值==== com.hdjz.mytest.activity.MainActivity$2@22078df System.out: MainActivity_msg==== 5
创建另一个HandlerActivity,当消息发送时跳转到HandlerActivity。从结果会怎样呢?
//HandlerActivity.class //HandlerActivity 也设置一个消息监听 mHandlerListener = new MyApplication.HandlerListener() { @Override public void heandleMessage(Message msg) { System.out.println("HandlerActivity_msg==== " + msg.what); } };
很明显第一个监听被覆盖了,用事实说话
省略掉一些log,地址变了,接收消息的Acticviy也发生了变化System.out: MainActivity_msg==== 4 System.out: mListener 地址值==== com.hdjz.mytest.activity.MainActivity$1@54a87ea System.out: MainActivity_msg==== 5 System.out: mListener 地址值==== com.hdjz.mytest.activity.MainActivity$1@54a87ea System.out: HandlerActivity_msg==== 6 System.out: mListener 地址值==== com.hdjz.mytest.activity.HandlerActivity$2@aa3a08b System.out: HandlerActivity_msg==== 7 System.out: mListener 地址值==== com.hdjz.mytest.activity.HandlerActivity$2@aa3a08b System.out: HandlerActivity_msg==== 8 System.out: mListener 地址值==== com.hdjz.mytest.activity.HandlerActivity$2@aa3a08b System.out: HandlerActivity_msg==== 9 System.out: mListener 地址值==== com.hdjz.mytest.activity.HandlerActivity$2@aa3a08b
当我们再返回上一个activity时,log继续打印的当前的activity的数据,之前的监听已经被替换掉了,对此我只能说一句:失去了就永远的失去了,不会再回来了。爱过!
- 注意:全项目唯一handler,还是尽量message.what 区分开,不同消息类型实现不同作用。全剧唯一避免了每个activity都创建一个handler的尴尬现象