方便的ConditionVariable
今天在ApiDemo的Notification中看到使用ConditionVariable来定时刷新Notification,这个从来没有看到过,感觉比较新奇,于是上网查了下。
ConditionVariable主要有是作为一个条件变量来使用的。这个条件变量可以在两个方面控制,一是条件本身,二是阻塞线程。
ConditionVariable在条件方面的控制主要是通过构造方法public ConditionVariable (boolean state)
和open()
来完成的,而线程控制主要在是通过这三个方法,block()
,close()
和open()
。block()
就是阻塞线程,直到条件打开。close()
就是将ConditionVariable重置到关闭状态。open()
会将阻塞的线程全部释放。
由此可知,ConditionVariable在“如果在等待某个条件完成之前,需要将线程阻塞”的情况下简直是神器。它帮我们封装了繁琐的线程操作,直接简单调用就好。
在网上还看到一个哥们用ConditionVariable来实现对“长按”事件的判断,比较有趣,贴出来mark~
package chroya.fun;
import android.content.Context;
import android.os.ConditionVariable;
import android.view.MotionEvent;
import android.view.View;
import android.view.ViewConfiguration;
public class LongPressView3 extends View{
private ConditionVariable cv = new ConditionVariable();
private Thread longPressThread;
private Runnable longPressRunnable;
//是否释放
private boolean isReleased;
public LongPressView3(Context context) {
super(context);
longPressRunnable = new Runnable() {
public void run() {
//阻塞指定的时间
cv.block(ViewConfiguration.getLongPressTimeout());
if(!isReleased) {
//还没up,则触发长按
performLongClick();
}
}
};
createThread();
post(null);
}
private void createThread() {
longPressThread = new Thread(longPressRunnable);
}
@Override
public boolean dispatchTouchEvent(MotionEvent event) {
int action = event.getAction();
switch(action) {
case MotionEvent.ACTION_DOWN:
isReleased = false;
//重置为close状态
cv.close();
createThread();
longPressThread.start();
break;
case MotionEvent.ACTION_MOVE:
break;
case MotionEvent.ACTION_UP:
//up掉
isReleased = true;
//打开阻塞的线程
cv.open();
break;
}
return true;
}
}