代码运行顺序

ymhnan 2011-10-27 07:50:29

package cc.line;

import android.app.Activity;
import android.os.Bundle;
import android.os.Handler;

public class line extends Activity {
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
handler.post(line);
setContentView(R.layout.main);
System.out.println("main"+Thread.currentThread().getId());
}
Handler handler=new Handler();
Runnable line=new Runnable() {

public void run() {

System.out.println("run"+Thread.currentThread().getId()); try {
Thread.sleep(10000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
};
}




为什么输出的先是main,后是run
setContentView(R.layout.main);这句话是在handler.post()后面运行的,在Activity显示之前main就输出了 这是为什么?
...全文
203 18 打赏 收藏 转发到动态 举报
写回复
用AI写文章
18 条回复
切换为时间正序
请发表友善的回复…
发表回复
sky123123 2011-11-01
  • 打赏
  • 举报
回复
你的这个handler也是在ui线程中的,只有在onCreate执行完成之后才会发现, 哟, 原来还有印务等待执行哟、呵呵
sky123123 2011-11-01
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 fishmen26 的回复:]

我擦。。。消息队列是先进后出的。写错了
[/Quote]


先进后出的队列叫甚么队列哟 假设你去排队买火车票,你一个第一个排队却是最后一个买到票的人哟 哈哈、

表说站票了、恐怕你站的地方就米牛哟
多鱼的夏天 2011-11-01
  • 打赏
  • 举报
回复
handler是启动了一个新的线程,不会阻塞主线程。

启动新的线程需要时间,所以会先出现main
甜tianquan 2011-11-01
  • 打赏
  • 举报
回复
Handler 是启动了另一个线程,而此时的主线程不会阻塞。显然启动一个线程比setContentView更耗时
[/Quote]
-droidcoffee- 2011-10-31
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 fishmen26 的回复:]

这个结果一定是main thread 先执行,然后再是line thread 执行。

原因如下:

1.首先main thread 和 line thread 都属于UI线程。
2.handler.post(line) 是把line 这个runnalbe 发送到 UI线程的消息队列中。而消息队列是先进先出的。
3.在line到达UI的消息队列之前,已经有一个消息在执行了。这就是 U……
[/Quote]

mark 顶一个啊。。。。。
fishmen26 2011-10-30
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 ymhnan 的回复:]

但是为什么界面是10秒之后显示的呢
[/Quote]

Thread.sleep(10000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}

哥 sleep 是Thread类得一个静态方法啊
你在在onCreate中,就是让UI线程睡10秒啊
Future_Chen 2011-10-28
  • 打赏
  • 举报
回复

2.1的avd运行2.1的工程没问题,2.2的avd运行2.2的工程一直停留再开机界面,控制台一直是
Waiting for HOME ('android.process.acore') to be launched...
哪位大侠帮我解决下啊
wyx100 2011-10-28
  • 打赏
  • 举报
回复
Handler 是启动了另一个线程,而此时的主线程不会阻塞。显然启动一个线程比setContentView更耗时
ymhnan 2011-10-28
  • 打赏
  • 举报
回复
那输出为什么不是10秒之后啊
King_at_csdn 2011-10-28
  • 打赏
  • 举报
回复
Thread.sleep(10000);
你是先停了10秒再setContentView的吧
ymhnan 2011-10-28
  • 打赏
  • 举报
回复
但是为什么界面是10秒之后显示的呢
fishmen26 2011-10-28
  • 打赏
  • 举报
回复
我擦。。。消息队列是先进后出的。写错了
fishmen26 2011-10-28
  • 打赏
  • 举报
回复
这个结果一定是main thread 先执行,然后再是line thread 执行。

原因如下:

1.首先main thread 和 line thread 都属于UI线程。
2.handler.post(line) 是把line 这个runnalbe 发送到 UI线程的消息队列中。而消息队列是先进先出的。
3.在line到达UI的消息队列之前,已经有一个消息在执行了。这就是 UI主线程在执行,其执行顺序是:
onCreate()-> onStart()-> onResume() ->run
只有到达run区域时, 才会从消息队列取出新的信息,进行操作。所以无论你把 handler.post(line)放在哪里,都先看到main 然后才是line

楼主可将
System.out.println("run"+Thread.currentThread().getId()); try {
Thread.sleep(10000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
放到onCreate方法里,试试就知道了。
ymhnan 2011-10-28
  • 打赏
  • 举报
回复
没有看明白
King_at_csdn 2011-10-27
  • 打赏
  • 举报
回复
。。。是在同一个线程。以下才会开启新线程专门处理,且通过下面方法测试了几次,run方法里打印出的东西在前面。当然这种前后可能是不确定性的。。
HandlerThread ht = new HandlerThread("King");
ht.start();
handler = new Handler(ht.getLooper())
ljwangc11 2011-10-27
  • 打赏
  • 举报
回复
Handler 是启动了另一个线程,而此时的主线程不会阻塞。显然启动一个线程比setContentView更耗时
King_at_csdn 2011-10-27
  • 打赏
  • 举报
回复
测试了一下。貌似要在主线程把初始化事情做完先,在onResume方法执行完毕后才处理消息队列里的东西。
不知道别的朋友是怎么理解的。
ymhnan 2011-10-27
  • 打赏
  • 举报
回复
Help me

80,351

社区成员

发帖
与我相关
我的任务
社区描述
移动平台 Android
androidandroid-studioandroidx 技术论坛(原bbs)
社区管理员
  • Android
  • yechaoa
  • 失落夏天
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧