Handler的簡單使用介紹

      Handler在android程序開發中使用的很是頻繁、咱們知道android是不容許在子線程中更新UI的,這就須要藉助Handler來實現,那麼你是否想過爲何必定要這個這樣子作呢?並且Handler的內部消息處理機制到底是什麼樣的呢,咱們瞭解了以後還能夠作點什麼事?帶着這些疑問我係統的學習了一個講解Handler原理的課程,今天就在這裏將本身的學習收穫總結下來。畢竟好記性不如爛筆頭,想學會跑就必須先學會好好走路。在總結的時候確實很頭疼,由於Handler的原理是須要經過源代碼才能說的清楚的,並且它處理機制比較複雜,一時不知道該從哪裏提及。想來想去,就先從Handler的幾個簡單的使用方法開始吧,並且在總結過程當中爲了方便之後快捷的查閱使用,儘可能說的精煉,不牽涉到源碼的追蹤和解析。android

1、Handler是什麼數組

     Handler是android.os包下的一個消息處理的類。
app

      本身寫代碼的時候也將常常使用到Handler,可是對於Handler到底是什麼,還真說不出個因此然。Handler究竟是什麼呢?以下:post

Handler是android爲咱們封裝的一套消息處理的機制,也是一套子線程用來更新UI的機制

     所以,能夠知道,Handler能夠作兩件事,第一能夠在子線程中更新UI,第二能夠用來處理消息。下面咱們就利用Handler的API,舉一個簡單的小例子,來看一看Handler是怎麼處理消息和更新UI的。學習

2、Handler使用的l一個小例子以及相應的方法總結spa

     (1)模擬圖片輪播效果
線程

   你們在點擊淘寶的時候確定遇到過淘寶爲你推薦商品的狀況,並且推薦的圖片會快速的一張接一張的不斷的更換。如今咱們就用Handeler中的postDelayed方法來簡單模擬這樣子的一個圖片輪播的效果。你們能夠翻看源碼的註釋,這個方法是用來延遲發送一個Runnable實例的,也就是延遲執行該Runnable裏的run方法。code

   首先你要準備三張圖片(請讀者自行準備),而後新建項目「HandlerTest」,在其activity_main.xml中寫入以下代碼:xml

 1 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
 2     xmlns:tools="http://schemas.android.com/tools"
 3     android:layout_width="match_parent"
 4     android:layout_height="match_parent"
 5     >
 6 
 7    <ImageView 
 8        android:id="@+id/imgview"
 9        android:layout_width="wrap_content"
10        android:layout_height="wrap_content"
11        android:src="@drawable/ali"/>
12 
13 </LinearLayout>

      代碼很簡單,就是放置了一個ImageView用來顯示圖片而已。而後在MainActivity中寫入下面的代碼:對象

 1 package com.example.handldertest;
 2 
 3 import android.os.Bundle;
 4 import android.os.Handler;
 5 import android.widget.ImageView;
 6 import android.app.Activity;
 7 
 8 
 9 public class MainActivity extends Activity {
10     
11     private ImageView img;
12     //實例化圖片數組,存放的是他們的id
13     private int[] imgs = {R.drawable.ali,R.drawable.girl,R.drawable.q};
14     private int index = 0;
15 
16     private Handler mHandler = new Handler();
17     private MyRunnable mr = new MyRunnable();
18     
19     class MyRunnable implements Runnable{
20 
21         public void run() {
22           index++;
23           index = index%3;
24           
25           img.setImageResource(imgs[index]);
26           
27           mHandler.postDelayed(mr, 1000);
28             
29         }
30 
31     }
32     
33     protected void onCreate(Bundle savedInstanceState) {
34         super.onCreate(savedInstanceState);
35         setContentView(R.layout.activity_main);
36         img = (ImageView) findViewById(R.id.imgview);
37         
38         mHandler.postDelayed(mr, 1000);
39     }
40    
41 }

     而後咱們是怎麼首先圖片輪播的呢?其實很簡單,咱們在主線程中postDelayed一個mr對象,而後再在mr對象的run方法中,然它將本身再postDelayed,這樣子它就無限循環下去了。那麼run方法也就無限循環了,咱們只要在run方法中執行ImageView的圖片顯示邏輯便可。運行程序,效果以下圖:

 

 

(2)Handler經常使用的一個方法小結

     相信這些方法你們都不會感到陌生,在Handler的API中都是能夠查閱到的。現小結以下:

postDelayed(Runnable r, long delayMillis)    延遲多少秒後直接會執行Runnable裏的run方法
sendEmptyMessage(int what) 直接發送一個只包含what字段的消息
sendMessage(Message msg) 發送一個Message對象
removeCallbacks(Runnable r) 從Handler中移除一個Runnable對象
removeMessages(int what) 從Handler中移除一個what字段的消息

sendEmptyMessage(int what) 直接發送一個只包含what字段的消息
sendMessage(Message msg) 發送一個Message對象
removeCallbacks(Runnable r) 從Handler中移除一個Runnable對象
removeMessages(int what) 從Handler中移除一個what字段的消息
sendMessage(Message msg) 發送一個Message對象
removeCallbacks(Runnable r) 從Handler中移除一個Runnable對象
removeMessages(int what) 從Handler中移除一個what字段的消息
removeCallbacks(Runnable r) 從Handler中移除一個Runnable對象
removeMessages(int what) 從Handler中移除一個what字段的消息removeMessages(int what)

      上面的方法的使用應該是很熟悉的了,由於常常用到,就很少舉例子了,更多的方法能夠查找API文檔。把重點放在Handler的消息處理機制的總結上。這是下一篇文章所要作的內容。

相關文章
相關標籤/搜索