Android基础知识总结系列(二)——Handler

Handler 主要与哦两个作用:

(1)模拟定时器,在一定时间后做某些动作。

(2)线程间通信。

每个线程可以拥有唯一一个Looper,UI线程会自动创建它的Looper,但是子线程必须调用Looper.Prepare()创建。

在创建handler时可指定Looper,这样handler发送的Message或Runnable就会被送到指定的Looper的MessageQueue里,若不指定,会调用本线程的Looper,

如果本线程没有Looper,则会报错。

子线程更新UI界面流程

Android中的Handler机制

◆ 通过Runnable在子线程中更新界面的例子 

在onCreate中创建Handler 
public class HandlerTestApp extends Activity { 
        Handler mHandler; 
        TextView mText; 
        /** Called when the activity is first created. */ 
       @Override 
       public void onCreate(Bundle savedInstanceState) { 
           super.onCreate(savedInstanceState); 
           setContentView(R.layout.main); 
           mHandler = new Handler();//创建Handler 
           mText = (TextView) findViewById(R.id.text0);//一个TextView 
       } 
     ○ 构建Runnable对象,在runnable中更新界面,此处,我们修改了TextView的文字.此处需要说明的是,Runnable对象可以再主线程中创建,也可以再子线程中创建。我们此处是在子线程中创建的。 
     Runnable mRunnable0 = new Runnable() 
    { 
                @Override 
                public void run() { 
                        mText.setText("This is Update from ohter thread, Mouse DOWN");
                } 
    }; 
    ○ 创建子线程,在线程的run函数中,我们向主线程的消息队列发送了一个runnable来更新界面。

    private void updateUIByRunnable(){ 
          new Thread()  
         {  
               //Message msg = mHandler.obtainMessage();  
              public void run()  
             { 

                   //mText.setText("This is Update from ohter thread, Mouse DOWN");//这句将抛出异常
                   mHandler.post(mRunnable0);  
             }  
         }.start();

     }

◆ 用Message在子线程中来更新界面

1.    用Message更新界面与Runnable更新界面类似,只是需要修改几个地方。
    ○ 实现自己的Handler,对消息进行处理

    private class MyHandler extends Handler
    { 

        @Override 
        public void handleMessage(Message msg) { 
            super.handleMessage(msg); 
            switch(msg.what) 
            { 
            case UPDATE://在收到消息时,对界面进行更新 
                mText.setText("This update by message"); 
                break; 
            } 
        } 
    }

    ○ 在新的线程中发送消息     
    private void updateByMessage() 
    { 
        //匿名对象 
         new Thread() 
         { 
                public void run() 
                { 
                    //mText.setText("This is Update from ohter thread, Mouse DOWN");

                    //UPDATE是一个自己定义的整数,代表了消息ID 
                    Message msg = mHandler.obtainMessage(UPDATE);
                    mHandler.sendMessage(msg);
                } 
         }.start(); 
    }

原文地址:https://www.cnblogs.com/liubingna/p/3406383.html