Android教程網
  1. 首頁
  2. Android 技術
  3. Android 手機
  4. Android 系統教程
  5. Android 游戲
 Android教程網 >> Android技術 >> 關於Android編程 >> Android事件處理方法總結-Handler消息處理

Android事件處理方法總結-Handler消息處理

編輯:關於Android編程

一、Android中的事件處理方法

事件處理:響應用戶UI動作,提高應用程序交互性

1、基於監聽的事件處理機制

2、基於回調的事件處理機制

3、Handler消息處理

 

前面我們已經介紹了Android事件處理方法總結-基於監聽、基於回調的事件處理,這裡我們總結一下Handler消息處理

 

二、Handler消息傳遞機制詳解

1、為什麼要使用Handler消息傳遞

1).Android出於性能考慮,UI線程(主線程)是非線程安全的,為了避免線程安全問題,Android規定“ 只允許UI線程(即主線程)修改程序界面裡面的UI組件”

但是

有時候非UI線程業務可能也需要根據需求改變UI界面內容時,這時就可以利用Handler消息傳遞,子線程發送Handler Message給UI線程,通知UI線程去改變UI組件

2).Android主線程一般不操作 復雜業務邏輯、請求網絡等耗時操作,這些操作必須在新的子線程裡面,否則可能會引起ANR異常

 

2、Handler消息傳遞原理

4個主要參與對象:

Handler:消息發送接收處理類。負責從新啟動的線程中發送消息,在主線程中獲取並處理消息

Message:消息對象,即Handler接收和處理的消息對象

MessageQuene:消息隊列,Message存取於MessageQuene

Looper:每個線程只擁有一個Looper,以先進先出的方式負責從MessageQuene消息隊列裡面讀取Message交由Handler處理

\

 

 

3、Handler消息處理應用實例

Handler處理消息應用步驟

Ⅰ.主線程創建一個Handler,用於消息處理

Ⅱ.子線程發送消息

Ⅲ.主線程接收並處理消息

 

應用實例:讀取網絡圖片

布局文件activity_main.xml

  1. android:layout_width="match_parent"
  2. android:layout_height="match_parent"
  3. android:orientation="vertical"
  4. android:paddingBottom="@dimen/activity_vertical_margin"
  5. android:paddingLeft="@dimen/activity_horizontal_margin"
  6. android:paddingRight="@dimen/activity_horizontal_margin"
  7. android:paddingTop="@dimen/activity_vertical_margin"
  8. tools:context=".MainActivity">
  9.  
  10. android:id="@+id/et_url"
  11. android:layout_width="match_parent"
  12. android:layout_height="wrap_content"
  13. android:inputType="textUri"
  14. android:singleLine="true"
  15. android:text="http://pic39.nipic.com/20140320/2531170_111310894000_2.jpg"/>
  16.  
  17. android:id="@+id/btg_go"
  18. android:layout_width="match_parent"
  19. android:layout_height="wrap_content"
  20. android:text="打開網絡圖片"/>
  21.  
  22. android:id="@+id/img_urlpic"
  23. android:layout_width="match_parent"
  24. android:layout_height="0dip"
  25. android:layout_weight="1"/>
  26.  

示例代碼MainActivity.

  1. packagecom.yihui.handlermessage;
  2.  
  3. importjava.io.IOException;
  4. importjava.io.InputStream;
  5. importjava.net.HttpURLConnection;
  6. importjava.net.MalformedURLException;
  7. importjava.net.URL;
  8. importandroid.app.Activity;
  9. importandroid.graphics.Bitmap;
  10. importandroid.graphics.BitmapFactory;
  11. importandroid.os.Bundle;
  12. importandroid.os.Handler;
  13. importandroid.os.Message;
  14. importandroid.view.View;
  15. importandroid.view.View.OnClickListener;
  16. importandroid.widget.Button;
  17. importandroid.widget.EditText;
  18. importandroid.widget.ImageView;
  19. importandroid.widget.Toast;
  20.  
  21. publicclassMainActivityextendsActivityimplementsOnClickListener{
  22.  
  23. privateEditTextet_url;
  24. privateButtonbtg_go;
  25. privateImageViewimg_urlpic;
  26.  
  27. privatestaticfinalintSUCCESS=0;
  28. privatestaticfinalintFAIL=1;
  29.  
  30. privateHandlerhandler=newHandler(){
  31. /*handleMessage主線程接收子線程發送過來的消息*/
  32. @Override
  33. publicvoidhandleMessage(Messagemsg){
  34. super.handleMessage(msg);
  35.  
  36. switch(msg.what){
  37. caseFAIL:
  38. Toast.makeText(MainActivity.this,"讀取網絡圖片失敗!",0).show();
  39. break;
  40.  
  41. caseSUCCESS:
  42. img_urlpic.setImageBitmap((Bitmap)msg.obj);//UI主線程裡面更新UI信息
  43. break;
  44.  
  45. default:
  46. break;
  47. }
  48. }
  49. };
  50.  
  51. @Override
  52. protectedvoidonCreate(BundlesavedInstanceState){
  53. super.onCreate(savedInstanceState);
  54. setContentView(R.layout.activity_main);
  55.  
  56. et_url=(EditText)findViewById(R.id.et_url);
  57. btg_go=(Button)findViewById(R.id.btg_go);
  58. img_urlpic=(ImageView)findViewById(R.id.img_urlpic);
  59.  
  60. btg_go.setOnClickListener(this);
  61. }
  62.  
  63.  
  64. @Override
  65. publicvoidonClick(Viewv){
  66. finalStringpicUrl=et_url.getText().toString();
  67.  
  68. /*子線程裡面處理連接網絡抓取圖片的功能*/
  69. newThread(newRunnable(){
  70. @Override
  71. publicvoidrun(){
  72. BitmapnetBitmap=getBitmapFromNet(picUrl);
  73. Messagemsg=newMessage();
  74. if(netBitmap==null){
  75. msg.what=FAIL;
  76. }else{
  77. msg.what=SUCCESS;
  78. msg.obj=netBitmap;
  79. }
  80. handler.sendMessage(msg);
  81. }
  82. }).start();
  83. }
  84.  
  85. /*從URL讀取圖片信息*/
  86. privateBitmapgetBitmapFromNet(StringurlAddr){
  87. BitmapnetBitmap=null;
  88. HttpURLConnectionhttpConn=null;
  89.  
  90. try{
  91. URLurl=newURL(urlAddr);
  92.  
  93. httpConn=(HttpURLConnection)url.openConnection();
  94. httpConn.setRequestMethod("GET");
  95. httpConn.setConnectTimeout(30000);
  96. httpConn.setReadTimeout(10000);
  97.  
  98. httpConn.connect();
  99.  
  100. /*讀取成功*/
  101. if(200==httpConn.getResponseCode()){
  102. InputStreamis=httpConn.getInputStream();
  103. netBitmap=BitmapFactory.decodeStream(is);
  104. }
  105.  
  106. }catch(MalformedURLExceptione){
  107. e.printStackTrace();
  108. }catch(IOExceptione){
  109. e.printStackTrace();
  110. }finally{
  111. if(httpConn!=null){
  112. httpConn.disconnect();
  113. httpConn=null;
  114. }
  115. }
  116.  
  117. returnnetBitmap;
  118. }
  119. }

示例效果

\

 

Ps:這裡讀取的是網絡圖片,所以在AndroidManifest.xml清單文件裡面記得添加讀取網絡的權限 android.permission.INTERNET

  1. 上一頁:
  2. 下一頁:
熱門文章
閱讀排行版
Copyright © Android教程網 All Rights Reserved