我正在对 Android 上的对话框行为进行一些研究。
我知道 android 的设计是为了防止对话框成为模式,我也读过,例如这里对话框/警报对话框:如何在对话框启动时“阻止执行”(.NET 样式) https://stackoverflow.com/questions/2028697/dialogs-alertdialogs-how-to-block-execution-while-dialog-is-up-net-style,该对话框是异步执行的。
但我做了一些测试,发现对话框的执行要等到调用 show() 之后放置的代码执行。
这是我的测试代码:
public class MainActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
AlertDialog.Builder builder = new AlertDialog.Builder(this);
builder.setTitle("Question");
builder.setMessage("Yes or No?");
builder.setPositiveButton("YES", new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int which) {
dialog.dismiss();
}
});
builder.setNegativeButton("NO", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
dialog.dismiss();
}
});
AlertDialog alert = builder.create();
alert.show();
System.out.println("MainActivity.onCreate -Before sleep-");
Toast.makeText(this, "MainActivity.onCreate. -Before sleep-", Toast.LENGTH_LONG).show();
try {
Thread.sleep(5000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
Toast.makeText(this, "MainActivity.onCreate. -Wake up-", Toast.LENGTH_LONG).show();
System.out.println("MainActivity.onCreate. -Wake up-");
}
}
我的意思是,当您执行该测试代码时,它会执行到 onCreate() 方法的底部,包括 5 秒的暂停,之后,当您看到 toast 和写入日志猫的消息时,对话框为显示。
所以我认为对话框是异步的并不正确,因为它们似乎是在 UI 线程中执行的,而不是在不同的线程中执行的after一些代码已经完成。
真正奇怪的是,对话框的执行等待启动对话框的行之后编写的代码的执行。
此外,我不明白为什么 UI 线程应该被“模式对话框”阻止,而不是被行为如我所解释的对话框阻止。
当alert.show之后的行在对话框显示之前执行时,以及当这些行等待执行直到对话框从用户那里得到答案时(就像模态对话框的行为一样),UI线程的状态有什么区别?
预先感谢您的阅读,并对我的英语表示抱歉。