Android--Handler初步理解及基本使用
wdmx3331
8年前
<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>