解决方案 »

  1.   

    新人刚开始学android开发,看到handler这一章。知道可以在主线程(UI线程)的handler中接受其他线程的信息来更新Activity的UI,想到了一个疑问,handler是可以在一个线程(非主线程)里面声明的,那么这个handler就是属于这个线程(非主线程)的了,那这个线程的handler可以用来更新Activity的UI吗?(我是看到一句话说Activity只运行主线程来来修改UI组件的,联系起来就有这个疑问)。如果问题本身的描述就是存在理解的误区的话请指出。。谢谢!、
    我也不会,帮你顶一下话说,自己试验一下就知道了
      

  2.   

    handler不是属于某个子线程的,而是全局的。你子线程是发送消息给handler,通知他去更新ui
      

  3.   

    就想你说的Handler可以在线程中声明,实际上Handler依赖于当前线程中messageQueue和Looper(每个线程可以且只能有一个),也就是说你在非UI线程中构造的Handler,它的循环和事件处理仍然是在当前线程中执行的,不能更新UI。可以找些Handler原理文章看看
      

  4.   


    嗯··我这两天做了个DEMO试验了,当我把一个handler放在一个线程里面声明的时候。例如
    class ChangePicture extends Thread
    {
    public Handler mHandler;
    public void run()
    {
    Looper.prepare();
    mHandler=new Handler()
    {
    public void handleMessage(Message msg)
    {
    if(msg.what==0x123)
    {   
    更新UI操作 }
    }
    }
    };
    Looper.loop();
    }
    }
    程序是真的跑不了的,一直是进程错误自动闪退的;
    而当我把这个handler放在了主线程里面,就真的是可以更新UI而没有报错了;
    那换句话说,是不是可以肯定的得出结论:要更新UI的话,对应的handler只能在主线程里面?
      

  5.   

    将handler声明为全局变量,在线程中需要发送message的时候,直接就使用handler发送message,然后在外面处理就可以更新UI线程了
      

  6.   


    嗯··我这两天做了个DEMO试验了,当我把一个handler放在一个线程里面声明的时候。例如
    class ChangePicture extends Thread
    {
    public Handler mHandler;
    public void run()
    {
    Looper.prepare();
    mHandler=new Handler()
    {
    public void handleMessage(Message msg)
    {
    if(msg.what==0x123)
    {   
    更新UI操作 }
    }
    }
    };
    Looper.loop();
    }
    }
    程序是真的跑不了的,一直是进程错误自动闪退的;
    而当我把这个handler放在了主线程里面,就真的是可以更新UI而没有报错了;
    那换句话说,是不是可以肯定的得出结论:要更新UI的话,对应的handler只能在主线程里面?
    是的,需要更新UI就需要在主线程里构造handler,并传递给子线程,在非UI线程里构造Handler的意义就只在于异步消息通知了,可以用在回调处理的地方