前言:为了更简单,更方便,更有效地在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的作用?后续补上,或者看客们有什么好提议、好建议,欢迎交流,谢谢。