onCreate(Bundle savedInstanceState){
// show dialog A if something is not correct
new Thread(){
public void run(){
if(something is wrong) {
runOnUIThread(new Runnable(){
public void run(){
showDialog(A);
}
});
}
}
}.start();
// show dialog B
showDialog(B);
}
I want to know
- 将首先显示哪个对话框,顺序是否不确定?为什么?
- 如果订单是不确定的,我怎样才能重现A在B之前显示的情况?
谢谢!
- 哪个对话框将首先显示没有定义,您不应该像上面那样依赖于一个在另一个之前出现。线程调度程序不是在所有情况下都具有相同的确定性。
- 您需要锁定互斥锁(或任何其他锁定设备),以确保一个在另一个之前显示。
关于哪个对话框将首先显示的问题是不确定的。在某些情况下,顺序会发生变化。但是通常B会首先显示,因为9/10它会在你的线程检测到有问题之前把它的事件放在UI线程上。
我建议使用AsyncTask来执行启动所需的任何机制,然后在onPostExecute()中允许你的程序恢复启动,这样它就可以显示对话框(B),无论它需要什么。这样,如果对话框A正在显示,您可以在那里停止启动过程,而不显示b。
public class MyAsyncStartup extends AsyncTask<Integer,Integer,MyResult> {
MyActivity activity;
public MyResult handleBackground() {
if( somethingWentWrong ) return null;
}
public onPostExecute( MyResult result ) {
if( result == null ) {
showDialog(B);
} else {
activity.resumeStartupAndShowA();
}
}
}
- 我认为A不可能出现在B之前……这是因为runonuthread将事件添加到事件队列的末尾。该事件中的代码(显示对话框A)不会在onCreate()完成之后执行(这意味着对话框B首先显示)。
不能保证的是显示对话框B和调用runonuthread之间的顺序,但这无关紧要。以下是官方文档中的一个片段:
[runOnUIThread] Runs the specified action on the UI thread. If the current thread is the UI thread, then the action is executed immediately. If the current thread is not the UI thread, the action is posted to the event queue of the UI thread.
- N/A
在你知道A是否会显示之前,你不能显示B。因此,无论如何都必须等待工作线程。有可能把showDialog(B)在你的其他线程像这样吗?
onCreate(Bundle savedInstanceState){
// show dialog A if something is not correct
new Thread(){
public void run(){
runOnUiThread(new Runnable(){
public void run(){
if(something is wrong) {
showDialog(A);
}
showDialog(B);
}
});
}
}
}.start();
}