方便的ConditionVariable

方便的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;
    }   
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值