HandlerUtil 消息机制工具类

2017-11-17  本文已影响0人  颤抖的闪电

前言:为了更简单,更方便,更有效地在Activity中快速使用handler,并且消除handler所带来的内存泄露等等弊端,所以撸了一个HandlerUtil工具类。核心类如下,相当简单、淳朴,一看就懂的那种:

/**
 * @desc handler工具辅助类,方便快速使用handler主线程
 * @auth 方毅超
 * @time 2017/11/17 11:01
 */

public class HandlerUtil {

    private static MyHandler mHandler;

    /**
     * 直接获取handler
     *
     * @return
     */
    public static MyHandler getHandler() {
        if (mHandler == null)
            mHandler = new MyHandler();
        return mHandler;
    }

    /**
     * 设置handler,自定义handleMessage方法所要处理的内容。
     *
     * @param handler
     */
    public static void setHandler(MyHandler handler) {
        unInit();
        mHandler = handler;
    }

    /**
     * 格式化handler
     */
    public static void unInit() {
        //清除Handler的Message和Runnable
        if (mHandler == null) return;
        mHandler.removeCallbacksAndMessages(null);
        mHandler = null;
    }


    /**
     * 静态Handler类,不持有外部context。
     */
    public static class MyHandler extends Handler {
        private WeakReference<Activity> mActivity;

        public MyHandler() {
        }

        public MyHandler(Activity activity) {
            mActivity = new WeakReference<Activity>(activity);
        }

//        @Override
//        public void handleMessage(Message msg) {
//            if (mActivity != null) {
//                Activity activity = mActivity.get();
//                if (activity != null) {
//                    // ...
//                }
//            }
//        }
    }

    /**
     * 静态Runnable类,不持有外部context?
     */
    public static abstract class MyRunnable implements Runnable {
        public MyRunnable() {
        }

//        @Override
//        public void run() {
//            Log.d(TAG, "run: ");
//        }
    }
}

调用方法如下:
1、设置具体的handler,自定义handleMessage方法所要处理的内容

HandlerUtil.setHandler(new HandlerUtil.MyHandler(getActivity()) {
                                @Override
                                public void handleMessage(Message msg) {
                                }
                            });

2、提交任务

HandlerUtil.getHandler().postDelayed(new HandlerUtil.MyRunnable() {
                                @Override
                                public void run() {
                                    // ToDo
                                }
                            }, 500);

3、保险起见,在Activity退出时清除任务,在onDestroy()中

HandlerUtil.unInit();

后言:在HandlerUtil工具类中的静态MyRunnable,这样写以及这样引用不知道能否起到不持有外部context的作用?后续补上,或者看客们有什么好提议、好建议,欢迎交流,谢谢。

上一篇 下一篇

猜你喜欢

热点阅读