首页 > 代码库 > Handler使用

Handler使用

1、为什么要使用Handler机制呢?

  一般更新UI,我们都使用线程防止主线程的卡顿,但是我们都知道,java是线程不安全的,很容易造成不同的线程操作同一个view产生混乱。我们无法做到给每个线程,每个view对象都加一个锁,所以谷歌提供了一个给我们handler,通过looper这样的不断压栈出栈的规则,来进行线程的更新。

  讲是这么讲,不在线程(非主线程)中使用Handler与主线程产生联系,压根更新不了UI(不用的话会报错的)。

 

2、Handler的用途是什么呢?

  (1)更新UI

  (2)消息处理(所有activity的生命周期回调的方法都使用的是Handler)

 

3、Handler怎么用呢?

  (1)sendMessage

  (2)sendMessageDelayed

  (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一同使用,他们被称为四基友,还需要学习一下。

Handler使用