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

相关文章
相关标签/搜索