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

  • 相关阅读:
    飞思卡尔硬件 调试总结
    芯片散热器
    (028)[技术资料]et99加密狗打开函数的一个小bug
    (027)[技术资料]业余制作Windows图标
    (026)[工具软件]剪切板管理:Ditto
    (025)[系统故障]XP下禁止将串口设备识别成鼠标(转)
    (024)[工具软件]截屏录屏软件FSCapture(转)
    (023) 关于51单片机的A5指令
    (022)[工具软件]图片浏览 JPEGView
    (021)VMWare副虚拟磁盘和子虚拟磁盘id不匹配
  • 原文地址:https://www.cnblogs.com/caoxinyu/p/6647773.html
Copyright © 2011-2022 走看看