Android攻城狮Handler简介
生活随笔
收集整理的這篇文章主要介紹了
Android攻城狮Handler简介
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
Handler是什么?
Handler是Android提供的一套用來更新UI的機制,也是一套消息處理機制,可以通過它發送消息,也可以通過它處理消息。
所有Activity生命周期回調的方法(例如onCreate()、onDestory()等等),都是通過handler機制去發送消息的,然后根據不同的消息(message)做相應的分支處理。例如發送一個消息給 Framework,告知需要調用onCreate()或onDestory()方法。實際上在 Framework 當中,Activity的交互大部分都是用AMS(Activity Manager Service)做處理的。整個應用程序的核心的一個類就是 Activity Thread,Activity Thread就是通過handler機制接收到 Activity Manager Service發送的有關Activity生命周期的管理的消息(比如啟動)。為什么要使用Handler?
Android在設計的時候,就封裝了一套消息的創建、傳遞、處理機制,如果不遵循這樣的機制,就沒有辦法更新UI信息,并且會拋出異常信息。這樣的機制便包含Handler機制。
1. 我們要創建一個handler的時候,它會和默認的一個線程進行綁定,而這個默認的線程當中就有一個MessageQueue(消息隊列)。 2. handler的兩個用途:(1)定時發送一個Messages或者Runnables對象;(2)可以在一個線程當中去處理并執行一個Action的動作。 3. 主線程運行一個消息隊列,并管理著一些頂級的應用對象(top-level application objects),包括Activity、Broadcast Receiver等等,這些對象默認都是創建在Activity Thread(也就是我們常說的UI線程或者主線程)當中。
Handler的示例,實現圖片輪播。 代碼實現 1. 在主布局中定義一個ImageView控件。 2. 在 MainActivity 中創建并初始化ImageView,定義一個圖片數組 images 和數組下標索引 index,創建一個Handler對象。 3. 創建一個內部類 MyRunnable 實現 Runnable 接口,重寫 run() 方法:public void run() {index++;index = index%3; // 圖片輪播(一般是通過ViewPager實現圖片輪播)imageView.setImageResource(images[index]);handler.postDelayed(myRunnable,1000); // 每隔一秒換一次圖片} 4. 在onCreste()方法中調用handler,也就是在主線程中調用handler:handler.postDelayed(myRunnable,1000); 1 public class MainActivity extends ActionBarActivity { 2 private Handler handler1 = new Handler(); 3 private Handler handler2 = new Handler(new Callback() { 4 5 @Override 6 public boolean handleMessage(Message msg) { 7 // TODO Auto-generated method stub 8 Toast.makeText(getApplicationContext(), "1", 1).show(); 9 return false;// 若設為true則后邊不執行 10 } 11 }) { 12 13 public void handleMessage(Message msg) { 14 // TODO Auto-generated method stub 15 Toast.makeText(getApplicationContext(), "2", 1).show(); 16 } 17 18 }; 19 20 21 private Handler handler3 = new Handler() { 22 public void handleMessage(android.os.Message msg) { 23 // textView.setText(""+msg.arg1+"-"+msg.arg2); 24 textView.setText("" + msg.obj); 25 }; 26 }; 27 28 29 private TextView textView; 30 private ImageView imageView; 31 private int Image[] = { R.drawable.a, R.drawable.b, R.drawable.c }; 32 private int index; 33 34 @Override 35 protected void onCreate(Bundle savedInstanceState) { 36 super.onCreate(savedInstanceState); 37 setContentView(R.layout.fragment_main); 38 textView = (TextView) findViewById(R.id.textview); 39 imageView = (ImageView) findViewById(R.id.imageView1); 40 new Thread() { 41 public void run() { 42 try { 43 Thread.sleep(2000); 44 // (1) 45 // Message message=new Message(); 46 // message.arg1=88; 47 // message.arg2=100; 48 49 // (2) 50 Message message = handler3.obtainMessage(); 51 52 Person person = new Person(); 53 person.age = 23; 54 person.name = "zy"; 55 message.obj = person; 56 // handler.sendMessage(message);//(1) 57 message.sendToTarget();// (2) 58 59 } catch (InterruptedException e) { 60 // TODO Auto-generated catch block 61 e.printStackTrace(); 62 } 63 }; 64 }.start(); 65 66 /* 67 * new Thread() { 68 * public void run() { 69 * try { Thread.sleep(1000); 70 * handler.post(new Runnable() { 71 * 72 * @Override 73 * public void run() { 74 * // TODO Auto-generated method stub 75 * textView.setText("更新線程"); } }); 76 * 77 * } catch (InterruptedException e) { // TODO Auto-generated catch block 78 * e.printStackTrace(); } }; }.start(); 79 */ 80 81 handler1.postDelayed(myRunnable, 1000);// 1000:一秒鐘換一次 82 83 } 84 85 MyRunnable myRunnable = new MyRunnable(); 86 //圖片循環播放 87 class MyRunnable implements Runnable { 88 89 @Override 90 public void run() { 91 // TODO Auto-generated method stub 92 index++; 93 index = index % 3; 94 imageView.setImageResource(Image[index]); 95 handler1.postDelayed(myRunnable, 1000); 96 } 97 } 98 99 class Person { 100 public int age; 101 public String name; 102 103 @Override 104 public String toString() { 105 // TODO Auto-generated method stub 106 return "name=" + name + "age=" + age; 107 } 108 } 109 110 public void click(View view) { 111 handler1.removeCallbacks(myRunnable); 112 handler2.sendEmptyMessage(1); 113 } 114 115 }
1. 我們要創建一個handler的時候,它會和默認的一個線程進行綁定,而這個默認的線程當中就有一個MessageQueue(消息隊列)。 2. handler的兩個用途:(1)定時發送一個Messages或者Runnables對象;(2)可以在一個線程當中去處理并執行一個Action的動作。 3. 主線程運行一個消息隊列,并管理著一些頂級的應用對象(top-level application objects),包括Activity、Broadcast Receiver等等,這些對象默認都是創建在Activity Thread(也就是我們常說的UI線程或者主線程)當中。
Handler的示例,實現圖片輪播。 代碼實現 1. 在主布局中定義一個ImageView控件。 2. 在 MainActivity 中創建并初始化ImageView,定義一個圖片數組 images 和數組下標索引 index,創建一個Handler對象。 3. 創建一個內部類 MyRunnable 實現 Runnable 接口,重寫 run() 方法:public void run() {index++;index = index%3; // 圖片輪播(一般是通過ViewPager實現圖片輪播)imageView.setImageResource(images[index]);handler.postDelayed(myRunnable,1000); // 每隔一秒換一次圖片} 4. 在onCreste()方法中調用handler,也就是在主線程中調用handler:handler.postDelayed(myRunnable,1000); 1 public class MainActivity extends ActionBarActivity { 2 private Handler handler1 = new Handler(); 3 private Handler handler2 = new Handler(new Callback() { 4 5 @Override 6 public boolean handleMessage(Message msg) { 7 // TODO Auto-generated method stub 8 Toast.makeText(getApplicationContext(), "1", 1).show(); 9 return false;// 若設為true則后邊不執行 10 } 11 }) { 12 13 public void handleMessage(Message msg) { 14 // TODO Auto-generated method stub 15 Toast.makeText(getApplicationContext(), "2", 1).show(); 16 } 17 18 }; 19 20 21 private Handler handler3 = new Handler() { 22 public void handleMessage(android.os.Message msg) { 23 // textView.setText(""+msg.arg1+"-"+msg.arg2); 24 textView.setText("" + msg.obj); 25 }; 26 }; 27 28 29 private TextView textView; 30 private ImageView imageView; 31 private int Image[] = { R.drawable.a, R.drawable.b, R.drawable.c }; 32 private int index; 33 34 @Override 35 protected void onCreate(Bundle savedInstanceState) { 36 super.onCreate(savedInstanceState); 37 setContentView(R.layout.fragment_main); 38 textView = (TextView) findViewById(R.id.textview); 39 imageView = (ImageView) findViewById(R.id.imageView1); 40 new Thread() { 41 public void run() { 42 try { 43 Thread.sleep(2000); 44 // (1) 45 // Message message=new Message(); 46 // message.arg1=88; 47 // message.arg2=100; 48 49 // (2) 50 Message message = handler3.obtainMessage(); 51 52 Person person = new Person(); 53 person.age = 23; 54 person.name = "zy"; 55 message.obj = person; 56 // handler.sendMessage(message);//(1) 57 message.sendToTarget();// (2) 58 59 } catch (InterruptedException e) { 60 // TODO Auto-generated catch block 61 e.printStackTrace(); 62 } 63 }; 64 }.start(); 65 66 /* 67 * new Thread() { 68 * public void run() { 69 * try { Thread.sleep(1000); 70 * handler.post(new Runnable() { 71 * 72 * @Override 73 * public void run() { 74 * // TODO Auto-generated method stub 75 * textView.setText("更新線程"); } }); 76 * 77 * } catch (InterruptedException e) { // TODO Auto-generated catch block 78 * e.printStackTrace(); } }; }.start(); 79 */ 80 81 handler1.postDelayed(myRunnable, 1000);// 1000:一秒鐘換一次 82 83 } 84 85 MyRunnable myRunnable = new MyRunnable(); 86 //圖片循環播放 87 class MyRunnable implements Runnable { 88 89 @Override 90 public void run() { 91 // TODO Auto-generated method stub 92 index++; 93 index = index % 3; 94 imageView.setImageResource(Image[index]); 95 handler1.postDelayed(myRunnable, 1000); 96 } 97 } 98 99 class Person { 100 public int age; 101 public String name; 102 103 @Override 104 public String toString() { 105 // TODO Auto-generated method stub 106 return "name=" + name + "age=" + age; 107 } 108 } 109 110 public void click(View view) { 111 handler1.removeCallbacks(myRunnable); 112 handler2.sendEmptyMessage(1); 113 } 114 115 }
?
Android為什么要設計只能通過Handler機制更新UI呢? 最根本的目的就是解決多線程并發的問題。 1. 假如在一個Activity當中,有多個線程去更新UI,并且都沒有加鎖機制,那么會產生什么樣子的問題? --> 更新界面混亂。 2. 如果對更新UI的操作都進行加鎖處理的話又會產生什么樣子的問題? --> 性能下降。 正是對以上問題的考慮,Android給我們提供了一套更新UI的機制,我們只需遵循這樣的機制就可以了,根本不用去關心多線程(并發)的問題,所有的更新UI的操作,都是在主線程的消息隊列中去“輪詢”處理的。Handler的原理是什么? 面試經典問題:Looper、Handler、Message(或MessageQueue)三者間的關系? 一、Handler封裝了消息的發送(主要是將消息發送給誰(默認是Handler自己),以及什么時候發送)。 Looper: 1.內部包含一個消息隊列 MessageQueue,所有的 Handler 發送的消息都走向(加入)這個消息隊列。 2.Looper.Looper方法,就是一個死循環,不斷地從 MessageQueue 取得消息,如果有消息就處理消息,沒有消息就阻塞。 二、MessageQueue MessageQueue 就是一個消息隊列,可以添加消息,并處理消息。 三、Handler 也很簡單,內部會跟 Looper 進行關聯,也就是說,在 Handler 的內部可以找到 Looper,找到了 Looper 也就找到了 Message。在 Handler 中發送消息,其實就是向 MessageQueue 隊列中發送消息。總結:Handler 負責發送消息,Looper 負責接收 Handler 發送的消息,并直接把消息回傳給 Handler 自己,MessageQueue就是一個存儲消息的容器。轉載于:https://www.cnblogs.com/my334420/p/6758396.html
總結
以上是生活随笔為你收集整理的Android攻城狮Handler简介的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: “东华春秋杯”上海大学生网络安全技能大赛
- 下一篇: 全新的小米,从更流畅,更安全,更智慧的M