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.调试一定要一步一行的观察。

  • 相关阅读:
    js_css_dl.dt实现列表展开、折叠效果
    property_自己编写一个读取Property文件的Util类
    HttpClient_002_中文乱码、HttpClient中文乱码透析、总结
    HttpClient_001_初步实现项目01的servlet,与项目02的servlet,之间数据访问
    jsp:中文乱码解决
    linux命令
    js 监测from表单中的input和select,时时监测,没有输入或选择信息报错,不允许提交数据
    数据库的那些事
    待参考
    layer.open多次触发,遮罩层覆盖content的解决办法
  • 原文地址:https://www.cnblogs.com/caoxinyu/p/6647773.html
Copyright © 2011-2022 走看看