zoukankan      html  css  js  c++  java
  • 线程等待

    今天发现同事的一段代码,妈的,当时没看懂。后来一问才知道线程等待。

    它使用的场景就是在一个方法里面,调用AlertDialog api弹出了一个对话框,让用户选择,必须选择完之后才往下进行。

    也就是用户不操作,那么这个方法是不会return的。

    代码:

        private Calback             mAccountChangeCallback = new Calback() {
            private Object      mWaitLocker = new Object();
            private boolean     mConfim;
    
            @Override
            public boolean onBeforeAccountChange(String oldUserName, String newUserName) {
                if(TextUtils.isEmpty(oldUserName)) return true;
                if(oldUserName.equals(newUserName)) return true;
                BaseActivityHelper.hideProgressDialog(LoginActivity.this);
                //---请求用户确认
                String msgFormat = getString(R.string.login_msg_switch_account);
                String msgString = String.format(msgFormat, newUserName);
                BaseActivityHelper.setDialogEventListener(LoginActivity.this,new ListenerDialogEvent() {
    
                    @Override
                    public void onEvent(int event, Object currObj, Object param, int index) {
                        mConfim = currObj == null ? false : (Boolean) currObj;
                        synchronized (mWaitLocker) {
                            mWaitLocker.notifyAll();
                        }
                    }
                }, null);
    
                Message msg = new Message();
                String[] result = new String[]{getString(R.string.login_switch_account) , msgString};
                msg.what = MSG.MSG_APP_SHOW_DIALOG_CUSTOM;
                msg.arg1 = R.array.alert_btn_d;
                msg.arg2 = 0;
                msg.obj  = result;
                mHandler.sendMessage(msg);
    
                //---等待用户确认
                synchronized (mWaitLocker) {
                    try {
                        mWaitLocker.wait();
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                }
    
    
                return mConfim;
            }
    
            @Override
            public boolean onAfterAccountChange(String oldUserName,
                    String newUserName) {
                return false;
            }
        };

    1.private Object mWaitLocker = new Object();
    2.主要是这个方法:onBeforeAccountChange

    在return之前加了一个,等待用户去点击:

      //---等待用户确认
                synchronized (mWaitLocker) {
                    try {
                        mWaitLocker.wait();
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                }

    wait线程等待,这个方法就不返回,就不往下走了。

    3.用户点击之后就会回调

     @Override
                    public void onEvent(int event, Object currObj, Object param, int index) {
                        mConfim = currObj == null ? false : (Boolean) currObj;
                        synchronized (mWaitLocker) {
                            mWaitLocker.notifyAll();
                        }
                    }
                }, null);

    这时候通知所有这个加锁的线程去唤醒。
    notifyAll()

    注:
    1.调试一定要一步一行的观察。

  • 相关阅读:
    python学习之那些你不在乎却操作非主流的练习题(一)
    python学习之数据类型(int,bool,str)
    Python学习之格式化简述
    Python学习之认知(二)
    Python学习之认知(一)
    Python学习之初识
    scrollTo与scrollTop及其区别
    js点击当前元素传入id从而获取其他元素
    微信支付功能
    cookie,sessionStorage,localStorage区别
  • 原文地址:https://www.cnblogs.com/caoxinyu/p/6647773.html
Copyright © 2011-2022 走看看