专注收集记录技术开发学习笔记、技术难点、解决方案
网站信息搜索 >> 请输入关键词:
您当前的位置: 首页 > Android

一段很简单的例子程序带来的疑惑。该如何解决

发布时间:2010-05-30 10:54:06 文章来源:www.iduyao.cn 采编人员:星星草
一段很简单的例子程序带来的疑惑。
非常简单一段代码
Java code

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

public class TestHandler extends Activity {

    private Handler handler=new Handler();
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        // TODO Auto-generated method stub
        super.onCreate(savedInstanceState);
        handler.post(theadRunnable);
        setContentView(R.layout.main);
        
        System.out.println("Activity ID:"+Thread.currentThread().getId());
        System.out.println("Activity NAME:"+Thread.currentThread().getName());
    }
    private Runnable theadRunnable=new Runnable() {
        
        @Override
        public void run() {
            // TODO Auto-generated method stub
            System.out.println("Handler ID:"+Thread.currentThread().getId());
            System.out.println("Handler NAME:"+Thread.currentThread().getName());
            try {
                Thread.sleep(100000);
            } catch (Exception e) {
                // TODO: handle exception
                e.printStackTrace();
            }
        }
    };
}


然后,它的输出结果是:
12-22 13:19:29.361: I/System.out(372): Activity ID:1
12-22 13:19:29.410: I/System.out(372): Activity NAME:main
12-22 13:19:29.471: I/System.out(372): Handler ID:1
12-22 13:19:29.471: I/System.out(372): Handler NAME:main
这让我很不理解,输出结果的顺序和我想的完全相反。
希望有朋友能帮我解释这个输出结果是为何。。。


------解决方案--------------------
handler.post(theadRunnable);通俗点说,post方法的功能好比是向消息队列中放入一个任务theadRunnable,任务放进去后,这个方法就返回了,这个任务并不会立马被执行;主线程继续向下
执行,所以先看到的是main的信息。等main执行完后(这个速度是很快的),再从消息队列中取出
刚才放的任务,并执行这个任务,也就是run方法,所有后看到的是thread信息。一句话:就是Android中所谓的异步机制。
------解决方案--------------------
runable和 onCreate都是在主线程中运行的,也就是main。

runable又不是一个thread, post过去等会还是在主线程消息轮回中之心的。

要新起thread的话,你得创建thread并start它才可以。
------解决方案--------------------
theadRunnable任务其实也是在主线程中执行的!
------解决方案--------------------
这里也没啥异步不异异步的

那些回调函数, onCreate,onPause, onStop等, 和你runable中的run在主线程中的调用过程差不多。
post一个消息,是塞到队列的尾部, 消息循环取队列头上的动作去执行。你的handler.post(theadRunnable);
还要等很久才能排上队执行呢
友情提示:
信息收集于互联网,如果您发现错误或造成侵权,请及时通知本站更正或删除,具体联系方式见页面底部联系我们,谢谢。

其他相似内容:

热门推荐: