首页
学习
活动
专区
圈层
工具
发布
社区首页 >专栏 >Android之ConditionVariable使用

Android之ConditionVariable使用

作者头像
李小白是一只喵
发布2021-07-01 10:02:45
发布2021-07-01 10:02:45
9590
举报
文章被收录于专栏:算法微时光算法微时光

image.png

ConditionVariable

Android开发中,需要线程同步,可以使用Java系统库的wait()和notify()。

但是这些代码的编写比较麻烦,Android提供了一个ConditionVariable类方便线程同步操作。

ConditionVariable有三个方法:

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

ConditionVariable 在创建时还有一种构造方法是 public ConditionVariable (boolean state) ,如果为true,默认时为opened,如果为false则是closed. ,默认public ConditionVariable()为closed.

使用实例

代码语言:javascript
复制
public class MainActivity extends Activity implements OnClickListener {
    private Button btn_output;
    private TextView textView;
    private MyHandler mHandler;
    private boolean isStart;
    private String str = "";
    private ConditionVariable mConditionVariable;
    private final int REFRESHTEXT = 1;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

                // 获取按钮
        btn_output = (Button) findViewById(R.id.btn);
        btn_output.setOnClickListener(this);
        textView = (TextView) findViewById(R.id.txt);
        mHandler = new MyHandler();
        mConditionVariable = new ConditionVariable();
        isStart = true;
        new Thread(new Runnable() {
            @Override
            public void run() {
                // TODO Auto-generated method stub
                while(isStart) {
                    //延时等待3秒
                    mConditionVariable.block(3000);
                    //如果是点击了按钮,则先将条件重置,否则block会失效
                    mConditionVariable.close();
                    //线程唤醒后通知主线程更新TextView的文本
                    mHandler.sendEmptyMessage(REFRESHTEXT);
                }
            }
        }).start();
    }
 
    private class MyHandler extends Handler {
        public void handleMessage(Message msg) {
            switch(msg.what) {
            case REFRESHTEXT:
                textView.setText(str += 's');
                break;
            }
        }
    }
    
    @Override
    public void onClick(View v) {
        // TODO Auto-generated method stub
        mConditionVariable.open();
    }
 
    @Override
    protected void onDestroy() {
        // TODO Auto-generated method stub
        super.onDestroy();
        isStart = false;
    }
}
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
如有侵权请联系 cloudcommunity@tencent.com 删除
目录
  • ConditionVariable
  • 使用实例
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档