Android -永久线程池
听着谢春花的《借我》。该曲也是小姑娘的成名曲。其中借我十年,借我亡命天涯的勇敢,借我说得出口的旦旦誓言...静看光阴荏苒,借我哑口无言,不管不顾不问不说,也不念。描述的是一个,想要打破自己现在庸碌的生活却没有勇气彻底颠覆自己现有的生活的,年轻人。他/她想要不管不顾地做事,不问他人的想法,不辩解的想法,也不再怀念过去那些庸碌平淡的生活。但是他/她对这种想法犹疑不决,甚至畏惧这种改变会给自己带来的颠覆。对这首歌喜爱的人大致也是有类似想法的年轻人吧!言归正传吧!
相信架构设计师遇见过这样的问题:某些activity、WindowManager、fragment所在的线程需要在一段是时间内一直在运行。比如:通话界面、显示数据动态改变的页面等。这时候我们需要一个永久的线程管理池。
1.第一步当然是展示永久线程池的文件--ThreadForeverManager.java
- 1注册的执行函数中不可有耗时操作 (暂时不用)
- 2一直存在的线程,如果需要执行某函数,请继承ThreadForever并向向 此ThreadForeverManager对象注册即可
、
public class ThreadForeverManager {
* 接口(需要利用线程的函数继承此接口)
/
public interface ThreadForever {
/*
* 线程执行函数(50ms执行一次),一定不要在此线程中加入耗时操作
*/
public void doThread();
}
private static final String TAG = "ThreadForeverManager";
private static ThreadForeverManager sThreadForeverManager;
public static ThreadForeverManager getInstance() {
if (sThreadForeverManager == null) {
sThreadForeverManager = new ThreadForeverManager();
Log.i(TAG, "常驻线程开启");
}
return sThreadForeverManager;
}
/** ThreadForever接口实现类对象结集合 */
private HashSet<ThreadForever> mThreadForeverSet = new HashSet<ThreadForever>();
/**
* 注册
*/
public void register(ThreadForever threadForever) {
if (threadForever == null) {
return;
}
Log.i(TAG, "注册线程监听事件成功");
synchronized (mThreadForeverSet) {
mThreadForeverSet.add(threadForever); // 注册
}
}
/**
* 注销监听down事件
*/
public void cancel(ThreadForever threadForever) {
synchronized (mThreadForeverSet) {
if (mThreadForeverSet.remove(threadForever)) {
Log.i(TAG, "注销线程监听事件成功");
}
}
}
/** 构造函数 并开启线程*/
private ThreadForeverManager() {
new Thread() {
public void run() {
while (true) {
synchronized (mThreadForeverSet) {
for (ThreadForever threadForever : mThreadForeverSet) {
threadForever.doThread(); //线程执行函数
}
}
delay(50); // 50ms循环一次
}
}
}.start();
}
/**
* 延时
*/
private void delay(int m) {
try {
Thread.sleep(m);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
永久线程池中,具有包括类的对象注册、注销方法。在构造函数里面开启线程。类的对象存储采用的是HashSet集合。注册和销毁的时候都要保证线程同步。同时文件可以设计了一个回调接口--线程执行函数。开启线程时候也设置执行一次所需的时间。
2.第二部就是延时执行控制的类了,代码如下:
、、
public class DelayExecute {
public interface Execute{
public void go();
}
/** 最后执行时间*/
private long lastTime;
private Execute mExecute;
private int delay;
public DelayExecute(int delay, Execute mExecute){
if(delay < 0 || mExecute == null){
throw new IllegalAccessError("DelayExecute 初始化异常, 参数不正确, delay = " + delay + " mExecute = " + mExecute);
}
this.mExecute = mExecute;
this.delay = delay;
}
/**
* 外部线程中调用执行
*/
public void execute(){
long currentTime = SystemClock.uptimeMillis();
if (currentTime - lastTime > this.delay) {
if (this.mExecute != null) {
this.mExecute.go();
}
lastTime = currentTime;
}
}
3.如何调用?只要集成永久线程池的类(ThreadForeverManager)实现回调接口。以及在相关的方法里面注册和销毁即可啦!
public void doThread() {
mDelayExecute.execute();
}
其中mDelayExecute为延时控制类的对象(DelayExecute),注册代码和销毁代码如下:
ThreadForeverManager.getInstance().register(FragmentContacts.this);
ThreadForeverManager.getInstance().cancel(FragmentContacts.this);
OK!借我一束光照亮黯淡,借我笑颜灿烂如春天,借我纵容的悲怆与哭喊!生活就是这样多姿多味。尝够了就长大了!
本文章非常感谢陈老大和郭老大技术的支持!