今天发现同事的一段代码,妈的,当时没看懂。后来一问才知道线程等待。
它使用的场景就是在一个方法里面,调用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.调试一定要一步一行的观察。