ConditionVariable的用法

 线程操作经常用到wait和notify,用起来稍显繁琐,而Android给我们封装好了一个ConditionVariable类,用于线程同步。提供了三个方法block()、open()、close()。

void block()
阻塞当前线程,直到条件为open
void block(long timeout)
阻塞当前线程,直到条件为open或超时
void open()
释放所有阻塞的线程
void close()
将条件重置为close

下面讲一个实际的例子。用ConditionVariable实现自定义长按事件。前面讲过自定义长按事件的两种方式,此处算是第三种方式吧,虽然挺牵强的,但是这只是展示运用ConditionVariable的小例子。

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;  
    }     
}
原理是这样的:down的时候,重置ConditionVariable的状态,开启一个线程,线程里面将阻塞指定的时间。如果阻塞时间已到,线程醒了,还未up,则形成长按。如果在线程醒来之前就释放了,则当到线程醒来的时候,执行判断,得知已经up,则未形成长按。
    每次down都创建一个线程,很浪费资源,所以这不是自定义长按事件的好方法。


  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值