一、爲何要使用Handler機制呢?java
通常更新UI,咱們都使用線程防止主線程的卡頓,可是咱們都知道,java是線程不安全的,很容易形成不一樣的線程操做同一個view產生混亂。咱們沒法作到給每一個線程,每一個view對象都加一個鎖,因此谷歌提供了一個給咱們handler,經過looper這樣的不斷壓棧出棧的規則,來進行線程的更新。android
在別的線程中更新UI,還有一些別的方法就不介紹了,不單單是Handler安全
二、Handler的用途是什麼呢?app
(1)更新UIide
(2)消息處理(全部activity的生命週期回調的方法都使用的是Handler)oop
三、Handler怎麼用呢?post
(1)sendMessage學習
(2)sendMessageDelayedspa
(3)post(Runnable)線程
(4)postDelay(Runnable,long)
1 package android.com.java.handler; 2 3 import android.os.Bundle; 4 import android.os.Handler; 5 import android.os.Message; 6 import android.support.v7.app.AppCompatActivity; 7 import android.widget.ImageView; 8 import android.widget.TextView; 9 10 public class MainActivity extends AppCompatActivity { 11 12 private int Images[] = {R.mipmap.b1,R.mipmap.b2,R.mipmap.b3}; 13 private int index = 0; 14 private ImageView imageView; 15 private TextView textView; 16 private Handler handler1 = new Handler();//處理圖片變換 17 private MyRunnable myRunnable = new MyRunnable(); 18 19 @Override 20 protected void onCreate(Bundle savedInstanceState) { 21 super.onCreate(savedInstanceState); 22 setContentView(R.layout.activity_main); 23 imageView = (ImageView)findViewById(R.id.image); 24 textView = (TextView)findViewById(R.id.textView); 25 handler1.postDelayed(myRunnable,1000);//跑一個runnable 26 new Thread(){ 27 @Override 28 public void run() { 29 try{ 30 Thread.sleep(1000); 31 // handler.post(new Runnable() { 32 // @Override 33 // public void run() { 34 // textView.setText("100"); 35 // } 36 // }); 37 Message msg = new Message(); 38 msg.arg1 = 88; 39 handler2.sendMessage(msg);//發送消息 40 }catch (Exception e){ 41 e.printStackTrace(); 42 } 43 } 44 }.start();//記住線程要start 45 } 46 47 private Handler handler2 = new Handler(){//處理接收到的信息 48 @Override 49 public void handleMessage(Message msg) { 50 textView.setText(""+msg.arg1);//記住要強制轉型 51 } 52 }; 53 54 class MyRunnable implements Runnable { 55 @Override 56 public void run() { 57 index ++ ; 58 index = index % 3; 59 imageView.setImageResource(Images[index]); 60 handler1.postDelayed(myRunnable,1000);//循環的跑下去 61 } 62 }; 63 64 65 }
寫了個小的demo,初學勿噴,通常handler 須要與looper,message queue,message一同使用,他們被稱爲四基友,還須要學習一下。