handler上遇到的一个问题

atgczj 2011-10-10 10:23:39
我知道handler是将一个消息(我这里是runable)放入UI activity的队列中,消息被排队进行处理。那么在下面的程序中,runable是队列中唯一的消息,因此直接被处理,也就是程序运行时,执行休眠10000ms后,屏幕上才会显示activity中的控件,事实也确实如此。可我认为输出"hello~"应该和控件的显示是同一时间,也就是10000ms后。可为什么结果却是程序一运行就直接输出了"hello~",而activity的控件却是10000ms后显示的呢?
public class Handle_01Activity extends Activity {
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);

firstHandler.post(runnable);

setContentView(R.layout.main);
System.out.println("hello~");
}
Handler firstHandler = new Handler();
Runnable runnable = new Runnable()
{
@Override
public void run()
{
try
{
Thread.sleep(10000);
} catch (Exception e)
{}
}
};
}
...全文
108 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
asssasharp 2011-10-10
  • 打赏
  • 举报
回复
handler 是进入了队列。但是System.out是另外的队列吧。应该不是一个队列。
fire_fire_fire 2011-10-10
  • 打赏
  • 举报
回复
虽然都在同一个线程中,但是你添加到了消息队列中,所以运行顺序就不确定了。
这是个人的理解
atgczj 2011-10-10
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 jesus7_wei 的回复:]
引用 6 楼 atgczj 的回复:
[/Quote]

你是说System.out.println()是静态方法么?
jesus7_w 2011-10-10
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 atgczj 的回复:]

引用 3 楼 jesus7_wei 的回复:
你那个handler 是 依赖ui 线程的,所以其实还是在UI线程中工作的.

static HandlerThread task = new HandlerThread("task");
static {
task.start();
}
Handler firstHandler = new Handler(task.getLooper……
[/Quote]

一个类的运行,JVM做会以下几件事情 1、类装载 2、链接 3、初始化 4、实例化;而初始化阶段做的事情是初始化静态变量和执行静态方法等的工作
atgczj 2011-10-10
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 fire_fire_fire 的回复:]
虽然都在同一个线程中,但是你添加到了消息队列中,所以运行顺序就不确定了。
这是个人的理解
[/Quote]

运行顺序不就是先进先出么?怎么会不确定呢
atgczj 2011-10-10
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 jesus7_wei 的回复:]
你那个handler 是 依赖ui 线程的,所以其实还是在UI线程中工作的.

static HandlerThread task = new HandlerThread("task");
static {
task.start();
}
Handler firstHandler = new Handler(task.getLooper());
Runnable……
[/Quote]

对,handler是依赖于UI的,我疑惑的就是既然依赖于UI,那就应该按照顺序,先休眠10000ms,再出Activity界面,再输出“Hello~”,这样子排着队进行的,为什么结果却先输出“Hello~”,再执行别的呢?
atgczj 2011-10-10
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 asssasharp 的回复:]
handler 是进入了队列。但是System.out是另外的队列吧。应该不是一个队列。
[/Quote]
怎么会不是一个队列呢?不就是UI的messageQueue么?不应该是排在一个队列里,先进先出的么
knxw0001 2011-10-10
  • 打赏
  • 举报
回复
把自己给绕进去了。
jesus7_w 2011-10-10
  • 打赏
  • 举报
回复
你那个handler 是 依赖ui 线程的,所以其实还是在UI线程中工作的.

static HandlerThread task = new HandlerThread("task");
static {
task.start();
}
Handler firstHandler = new Handler(task.getLooper());
Runnable runnable = new Runnable() {
@Override
public void run() {
try {
Thread.sleep(10000);
Log.i("jesus", Thread.currentThread().getName());
} catch (Exception e) {
}
}
};

80,351

社区成员

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

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