代码说明:
<span style="font-size:18px;">Handler handler = new Handler();
Runnable update_thread = new Runnable() {
@Override
public void run() {
// TODO Auto-generated method stub
//线程每次执行时输出"UpdateThread..."文字,且自动换行
//textview的append功能和Qt中的append类似,不会覆盖前面
//的内容,只是Qt中的append默认是自动换行模式
text_view.append("\nUpdateThread...");
//延时1s后又将线程加入到线程队列中
handler.postDelayed(update_thread, 1000);
System.out.println("on update_thread");
}
};</span>
<span style="font-size:18px;"> protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
// requestWindowFeature(Window.FEATURE_NO_TITLE);
setContentView(R.layout.activity_main);
text_view = (TextView)findViewById(R.id.text_view);
start = (Button)findViewById(R.id.start);
start.setOnClickListener(new StartClickListener());
end = (Button)findViewById(R.id.end);
end.setOnClickListener(new EndClickListener());
handler.post(update_thread);
while(true)
{
// SystemClock.sleep(2000);
text_view.append("\non create...");
System.out.println("\n agian");
SystemClock.sleep(1000);
System.out.println("\n on Create");
}</span>
在while循环里面的textview不会显示on vreate。但是控制台会每隔一秒打印system.out的字符。另外hand.post目的让textview显示字符串,但是也没有效果。只是空白的activity。因为ui线程被while循环定格了。过了五秒之后,app自动停止,这就是系统自带的五秒异常退出。
个人理解:在android的应用里面的oncreate方法,不能被阻塞,即启动必须执行完这个方法。紧接着。在这个方法里面注册的view会才会去做显示功能,或者如上面代码才会去执行handler的post功能。
另外证明,handler.postdelay(runable,second)不会启动新线程,说明该runable与oncreate是同一条线程,runable的run执行代码是在oncreate执行完之后,该线程从消息队列里面取出来计算second之后再执行。
<span style="font-size:18px;">handler.postDelayed(update_thread, 1000);再次把run包装成一个消息发到生成handler的线程中,该线程执行run。如果是跟oncreate是同一个线程。那么就会每隔一秒执行一次run。</span>