【android】项目application全局唯一Handler(接口回调实现)

最近Handler玩嗨了,突发奇想搞一个全局的handler,苦思冥想3三小时,终于搞定!

  1. 先在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);
    }
  2. 在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();
    }
  3. 在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);
           }
       });
  4. 循环打印出发出的消息,并且当前的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
  5. 创建另一个HandlerActivity,当消息发送时跳转到HandlerActivity。从结果会怎样呢?

    //HandlerActivity.class
    //HandlerActivity 也设置一个消息监听
     mHandlerListener = new MyApplication.HandlerListener() {
            @Override
            public void heandleMessage(Message msg) {
                System.out.println("HandlerActivity_msg==== " + msg.what);
            }
        };
  6. 很明显第一个监听被覆盖了,用事实说话
    省略掉一些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
  7. 当我们再返回上一个activity时,log继续打印的当前的activity的数据,之前的监听已经被替换掉了,对此我只能说一句:失去了就永远的失去了,不会再回来了。爱过!

  8. 注意:全项目唯一handler,还是尽量message.what 区分开,不同消息类型实现不同作用。全剧唯一避免了每个activity都创建一个handler的尴尬现象

猜你喜欢

转载自blog.csdn.net/guojiayuan002/article/details/79933664