关于Handler的执行流程是怎么的?
它的多线程是从哪开始分的?
在Runnable的run方法里头写个死循环,界面会卡住...
证明post进消息队列之后,线程还是只有一个??
必须得不停的post吗?
那么run方法里头的代码岂不是要尽量的短?
小弟对handler比较疑惑,敢情各位详述一下handler的执行过程...
(找了些教程,尽都是只有一个例子,没有说"为什么"的...)

解决方案 »

  1.   

    Handller的默认构造函数是:
    Handler()
    Default constructor associates this handler with the queue for the current thread. If there isn't one, this handler won't be able to receive messages.如果你没有特殊的处理过的话,Handler都是在主线程中的,也就是GUI线程。一般要在onCreate中处理一些UI的初始话的话,使用默认的Handler还是不错的,可以让简单的界面先跑起来,然后给一个ProcessBar,等界面在handleMessage中构造好了,再关掉ProcessBar就好了。如果是要处理UI无关的逻辑,建议可以用Looper + Handler的方法。把Handler放在一个新的线程里处理。
    可以看这个例子
    http://hi.baidu.com/zhangtqqq/blog/item/62840117e8d9c511c83d6d67.html
      

  2.   

    Handler只对应一个线程,所以在GUI线程里,Runnable处理卡住了,GUI也就卡住了。
      

  3.   

    handler,译为处理者,用于从消息队列中提取消息进行处理!比如常见的UI线程外的线程要更新UI,因为线程不安全的,所以不能直接更新UI,该线程通过handler发送数据到消息队列,UI线程中,通过handlerMessage(Message msg),从消息队列中取出消息进行处理!更新UI!再者实现多线程有两种方法:一种Thread,一种Runnable
    一个类继承Thread类实现run()方法,通过start()即可实现多线程!
    而Runnable,可以实现run(),但本身没有start()方法!通过观察,Thread类的构造方法,可以传递Runnable对象,所以要用Runnable启动一个新线程!
    可以通过Thread构造!即Thread t=new Thread(Runnable对象);而hanlder就是多个线程之间数据的传递、处理!!本身处于UI线程,即主线程中!
      

  4.   

    也就是说android的UI不允许其它线程擅自修改其内容?
    因为我写一个runnable,里头写上button.setText("test");,然后用此Runnable创建Thread,然后setat;程序会出错;但在run里头写syso确不会出问题...
    -------------
    那android要怎样才能创建出一个合法的线程呢?
    我也用looper试了试,确实能行。但也发现,一个looper维护一个线程,而且等要执行的语句运行完了,貌似结束looper以及其绑定的Handler还有点麻烦
    各位使用多线程的时候都怎么用的?
      

  5.   


    写个简单的例子吧!    private int i=0;
        Handler myHandler=new Handler(){
    @Override
    public void handleMessage(Message msg) {
                          button.setText(msg.arg1+"");,//处理消息,更行UI
                    }
        }    Runnable r=new Runnable() {
    public void run() {
    // TODO Auto-generated method stub
                      while(true)
                    {
               i++;
                        Message message=new Message();
                        msg.arg1=i;//非UI线程中不能直接更新UI,即button.setText(i+"")是不行的
    try {
    Thread.sleep(1000);
    } catch (InterruptedException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
    }
            myHandler.sendMessage(msg);
    }
                 }
    };启动线程:Thread t=new Thread(r);
               t.start();
      

  6.   

    这样确实能行...不过我觉得这样处理起来有点乱:i值的变化在run里面,可button的setText又不得不到handleMessage里面去处理
    而且即使这样,handleMessage里面也不能做过多操作,不然也会卡死...