在执行以下代码时,我发现整个应用程序冻结了10000毫秒,然后在模拟器的屏幕上显示任何内容。我原本期望第一个Toast消息出现,然后应用程序冻结10000毫秒,第二个Toast消息出现。让我想知道android在执行它之前是否堆积了'oncreate'方法中的所有代码。应该是那样的吗?
public class MainActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Toast.makeText(this, new ServiceCode("Hi").s, Toast.LENGTH_SHORT).show();
try {
Thread.sleep(10000);
} catch (InterruptedException e) {
e.printStackTrace();
}
Toast.makeText(this, new ServiceCode("Hello").s, Toast.LENGTH_SHORT).show();
}
答案 0 :(得分:2)
表现如预期。有一个负责UI更新的线程。它被称为主线程。该线程也显示了Toast消息。当您致电Toast.show()
时,Android会为主线程安排新任务。当主线程与onCreate()
完成时,它将执行此任务并显示吐司。但是因为你阻止了主线程 10秒,所以没有显示toast。没有人免费,谁可以显示此消息。但是,10秒后,两个祝酒词将一个接一个地出现,因为主线程可以自由显示它们。
最佳做法是永不阻止 主线程。否则您的应用程序将冻结,用户将看到ANR(应用程序或响应)消息。如果您需要稍后执行某些操作,则需要将此任务发布到主线程的任务队列,以便稍后执行。
以下代码的行为符合您的预期。
public class MainActivity extends Activity {
private Handler handler = new Handler();
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
// show first toast immediately
Toast.makeText(this, new ServiceCode("Hi").s, Toast.LENGTH_SHORT).show();
// schedule second toast to appear 10 sec later
handler.postDelayed(new Runnable() {
@Override
public void run() {
Toast.makeText(MainActivity.this,
new ServiceCode("Hello").s, Toast.LENGTH_SHORT).show();
}
}, 10000);
}
}
答案 1 :(得分:1)
创建活动时,系统进程会向活动的UI线程发送消息。活动的UI线程收到消息,然后执行“onCreate”方法。
在这里,您可以在“onCreate”方法中祝酒。这不会立即显示吐司。它只将消息发送到UI线程的消息队列。在UI线程完成“onCreate”“onStart”“onResume”方法后,它会收到“Toast”消息。那一刻,Toast实际上显示在屏幕上。
答案 2 :(得分:0)
原因很简单,Toast类的show方法可能不是“内部”的同步调用,我的意思是,主线程不太可能等到Toast实际显示并呈现为继续,因此,它可能会启动一个功能来开始渲染Toast BUT,因为在强制主线程停止之后,它不会处理该请求,因为主线程具有最高优先级。
希望它有所帮助!
问候!
答案 3 :(得分:0)
查看这些链接以了解Android生命周期
http://developer.android.com/training/basics/activity-lifecycle/index.html
Android activity life cycle - what are all these methods for?
你创建了一个启动画面,
如果不删除
try {
Thread.sleep(10000);
} catch (InterruptedException e) {
e.printStackTrace();
}
你应用程序不会冻结。
答案 4 :(得分:0)
试试这个:
Toast.makeText(this, new ServiceCode("Hi").s, Toast.LENGTH_SHORT).show();
try {
Thread.sleep(10000);
} catch (InterruptedException e) {
e.printStackTrace();
}finally{
Toast.makeText(this, new ServiceCode("Hello").s, Toast.LENGTH_SHORT).show();
}
}
答案 5 :(得分:0)
Toast
的显示是异步调用。因此,一旦执行了Toast请求,操作系统就跳转到下一个操作,同时准备并显示toast。
在您的情况下,由于下一个操作阻止UI线程持续10秒,因此在释放UI线程之前不会显示Toast。