Android--Handler初步理解及基本使用

wdmx3331 7年前
   <h3><strong>1、什么是Handler</strong></h3>    <p>Handler是android给我们提供用来更新UI的一套机制;也是一套消息处理机制,可以发送消息,也可以通过它处理消息。</p>    <h3><strong>2、Android为什么需要Handler机制来更新UI?</strong></h3>    <p>根本目的:解决多线程并发问题。</p>    <p>比如在一个Activity中有多个线程去更新一个UI,且没有加锁的情况下,是会出现更新界面错乱的。如果对更新UI进行加锁,又会出现应用性能下降的问题。</p>    <h3><strong>3、如何使用Handler</strong></h3>    <p><strong>3.1、基本使用</strong></p>    <pre>  <code class="language-java">private Handler handler1 = new Handler(){      public void handleMessage(android.os.Message msg) {          T.show(TestHandlerActivity.this, "handleMessage");      };  };  //给Handler发送消息  public void testHandler(View v){              //发送一个空消息      handler1.sendEmptyMessage(i);      i++;      //发送一个自已定义的Message      Message obtainMessage = handler1.obtainMessage();      //携带一个int类型      obtainMessage.arg1 = 0;      //携带一个int类型      obtainMessage.arg2 = 1;      //携带一个objcet      obtainMessage.obj = new Person("thc","cool");      //Message的标志      obtainMessage.what = 1;      handler1.sendMessage(obtainMessage);      //也可以 obtainMessage.sendToTarget();后面再解释        Message msg = new Message();      obtainMessage.arg1 = 0;      obtainMessage.arg2 = 1;      obtainMessage.obj = new Person("thc","cool");      obtainMessage.what = 2;      handler1.sendMessage(msg);  }</code></pre>    <p>handler1.obtaineMessage()和new Message()的区别:</p>    <pre>  <code class="language-java">public static Message obtain() {      synchronized (sPoolSync) {          if (sPool != null) {              Message m = sPool;              sPool = m.next;              m.next = null;              m.flags = 0; // clear in-use flag              sPoolSize--;              return m;          }      }      return new Message();  }</code></pre>    <p>从Message的源码中可以看出,它是先从消息池中取一个消息,如果池中有消息就从池中取出一个,如果没有就new一个Message,所以我们使用的时候使用handler.obtainMessage就可以了,节省资源。</p>    <p>以及handler1.post(runnable r)等:</p>    <pre>  <code class="language-java">//  public void test2() {      new Thread(new Runnable() {          @Override          public void run() {              //运行在子线程中              L.D("当前线程--->" + Thread.currentThread());              handler1.post(new Runnable() {                  @Override                  public void run() {                      //运行在UI线程中                      L.D("当前线程--->" + Thread.currentThread());                  }              });          }      });  }</code></pre>    <p><strong>3.2、拦截Message</strong></p>    <p>通过给Handler增加一个CallBack对消息可以对消息进行拦截。返回true拦截,返回false不拦截。</p>    <pre>  <code class="language-java">private Handler handler1 = new Handler(new Handler.Callback() {      @Override      public boolean handleMessage(Message msg) {          if(msg.what == 0){              //拦截Msg              tvTest.setText("拦截了");              return true;          }          T.show(TestHandlerActivity.this, "callBack");          return false;      }  }){      public void handleMessage(android.os.Message msg) {          T.show(TestHandlerActivity.this, "handleMessage");      };  };</code></pre>    <p><strong>3.3、remove 一个 Runnable</strong></p>    <pre>  <code class="language-java">MyRunable mRunable = new MyRunable();  //运行一个Runnable,在运行一段时间之后让它停止掉即:remove掉这个Runable对象  public void test3() {      handler1.postDelayed(mRunable,1000);      if(i > 3){          handler1.removeCallbacks(mRunable);      }  }  class MyRunable implements Runnable{      @Override      public void run() {          tvTest.setText("收到消息:" + i);          i++;          handler1.postDelayed(mRunable, 1000);      }  }</code></pre>    <p> </p>    <p>来自:http://www.jianshu.com/p/4311a098ebaa</p>    <p> </p>