Handler使用

一、爲何要使用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一同使用,他們被稱爲四基友,還須要學習一下。

相關文章
相關標籤/搜索