歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
Linux教程網 >> Linux編程 >> Linux編程 >> Android入門:Handler

Android入門:Handler

日期:2017/3/1 10:16:45   编辑:Linux編程

一、Handler介紹

在一個線程中存在一個消息隊列,當消息隊列中存在消息時,Handler就會處理這些消息;我們考慮一下這種場景:

我們要執行一個耗時很長的業務,執行完後要返回一個結果顯示在TextView上,我們在主線程中執行這種業務是否合理呢?

顯然是不合理的,因此我們會想到把業務放到子線程中執行,但是Android有個規定:所有更新UI的操作全要在主線程中完成,因此我們要做的就是把子線程執行完的結果傳到主線程中並顯示,這就需要Handler的幫忙;

比如ProgressBar、TextView的使用都會用到Handler;

當應用5秒內沒有響應用戶的輸入,則會拋出以下錯誤:

Handler的原理如下:

模板代碼:

  1. package org.xiazdong.handler;
  2. public class SampleActivity extends Activity {
  3. private Button button;
  4. private Handler handler = new Handler(){
  5. @Override
  6. public void handleMessage(Message msg) {
  7. if(msg.what == 1){
  8. //更新UI
  9. }
  10. if(msg.what == 2){
  11. //更新UI
  12. }
  13. }
  14. };
  15. private OnClickListener listener = new OnClickListener() {
  16. class ServiceThread extends Thread{
  17. private ServiceListener serviceListener = new ServiceListener() {
  18. @Override
  19. public void onService(int current) {//服務監聽器
  20. //一邊執行,一邊發送消息給主線程
  21. handler.sendMessage(msg);
  22. }
  23. };
  24. @Override
  25. public void run() {
  26. //執行業務
  27. }
  28. }
  29. @Override
  30. public void onClick(View v) {
  31. ServiceThread thread = new ServiceThread(); //子線程執行業務
  32. thread.start();
  33. }
  34. };
  35. @Override
  36. public void onCreate(Bundle savedInstanceState) {
  37. super.onCreate(savedInstanceState);
  38. setContentView(R.layout.main);
  39. button = (Button)this.findViewById(R.id.button);
  40. button.setOnClickListener(listener);
  41. }
  42. }
Copyright © Linux教程網 All Rights Reserved