【问题标题】:Is a Dialog asynchronous on Android?Android上的对话框是异步的吗?
【发布时间】:2014-10-08 19:33:59
【问题描述】:

我正在对 android 上的对话行为进行一些研究。

我知道 android 旨在防止对话框成为模态,我还阅读了,例如这里 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 和写入日志 cat 的消息时,显示对话框。

所以我认为对话框是异步的是不正确的,因为它们似乎是在 UI 线程中执行而不是在不同的线程中执行,并且是在 某些代码完成之后执行的。

真正奇怪的是,Dialog的执行会等待在启动dialog的那一行之后写的代码的执行。

此外,我不明白为什么 UI 线程应该被“模式对话框”阻止,而不是像我解释的那样被行为的对话框阻止。

当 alert.show 之后的行在对话框显示之前执行时 UI 线程的状态有什么不同,当这些行等待执行直到对话框得到用户的回答时(作为模态对话框的行为) )?

提前感谢您的阅读,对不起我的英语。

【问题讨论】:

    标签: android asynchronous dialog


    【解决方案1】:

    那行代码:

    alert.show();
    

    告诉系统在 UI 线程的下一个“滴答”时异步显示警报,因此之后的所有代码都会首先执行。

    UI 线程有一个消息Looper 正在按顺序处理消息。您的 onCreate() 函数正在执行,因为循环器正在处理作为应用程序启动一部分的消息。 onCreate() 函数必须首先完成执行,然后 looper 才能循环回下一条消息,这将是通过调用 show() 放入消息队列中的“使警报对话框可见”消息。

    【讨论】:

      【解决方案2】:

      对话框是异步的,但是如果你在显示自己之前暂停 UI 线程,那么对话框正在渲染:)。这也与由动画引起的显示对话框的延迟有关

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2016-05-17
        • 1970-01-01
        • 2011-07-29
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-05-10
        • 1970-01-01
        相关资源
        最近更新 更多