Android事件处理方法总结-Handler消息处理

来源:互联网 发布:自学网络编程 编辑:程序博客网 时间:2024/05/22 04:56

一、Android中的事件处理方法

事件处理:响应用户UI动作,提高应用程序交互性

1基于监听的事件处理机制

2基于回调的事件处理机制

3Handler消息处理

 

前面我们已经介绍了 Android事件处理方法总结-基于监听 、 基于回调的事件处理,这里我们总结一下 Handler消息处理

 

二、Handler消息传递机制详解

1为什么要使用Handler消息传递

    1).Android出于性能考虑,UI线程(主线程)是非线程安全的,为了避免线程安全问题,Android规定“ 只允许UI线程(即主线程)修改程序界面里面的UI组件”

          但是

          有时候非UI线程业务可能也需要根据需求改变UI界面内容时,这时就可以利用Handler消息传递,子线程发送Handler Message给UI线程,通知UI线程去改变UI组件

    2).Android主线程一般不操作 复杂业务逻辑、请求网络等耗时操作,这些操作必须在新的子线程里面,否则可能会引起ANR异常

 

2Handler消息传递原理

   4个主要参与对象:

     Handler:消息发送接收处理类。负责从新启动的线程中发送消息,在主线程中获取并处理消息

     Message:消息对象,即Handler接收和处理的消息对象

         MessageQuene:消息队列,Message存取于MessageQuene

     Looper:每个线程只拥有一个Looper,以先进先出的方式负责从MessageQuene消息队列里面读取Message交由Handler处理

           

3Handler消息处理应用实例

   Handler处理消息应用步骤

      Ⅰ.主线程创建一个Handler,用于消息处理

      Ⅱ.子线程发送消息

      Ⅲ.主线程接收并处理消息

 

     应用实例:读取网络图片

       布局文件 activity_main.xml

[html] view plain copy
  1. <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"  
  2.     xmlns:tools="http://schemas.android.com/tools"  
  3.     android:layout_width="match_parent"  
  4.     android:layout_height="match_parent"  
  5.     android:orientation="vertical"  
  6.     android:paddingBottom="@dimen/activity_vertical_margin"  
  7.     android:paddingLeft="@dimen/activity_horizontal_margin"  
  8.     android:paddingRight="@dimen/activity_horizontal_margin"  
  9.     android:paddingTop="@dimen/activity_vertical_margin"  
  10.     tools:context=".MainActivity" >  
  11.   
  12.     <EditText  
  13.         android:id="@+id/et_url"  
  14.         android:layout_width="match_parent"  
  15.         android:layout_height="wrap_content"  
  16.         android:inputType="textUri"   
  17.         android:singleLine="true"  
  18.         android:text="http://pic39.nipic.com/20140320/2531170_111310894000_2.jpg"/>  
  19.   
  20.     <Button  
  21.         android:id="@+id/btg_go"  
  22.         android:layout_width="match_parent"  
  23.         android:layout_height="wrap_content"  
  24.         android:text="打开网络图片" />  
  25.   
  26.     <ImageView  
  27.         android:id="@+id/img_urlpic"  
  28.         android:layout_width="match_parent"  
  29.         android:layout_height="0dip"  
  30.         android:layout_weight="1" />  
  31.   
  32. </LinearLayout>  

       示例代码 MainActivity.Java

[java] view plain copy
  1. package com.yihui.handlermessage;  
  2.   
  3. import java.io.IOException;  
  4. import java.io.InputStream;  
  5. import java.net.HttpURLConnection;  
  6. import java.net.MalformedURLException;  
  7. import java.net.URL;  
  8. import android.app.Activity;  
  9. import android.graphics.Bitmap;  
  10. import android.graphics.BitmapFactory;  
  11. import android.os.Bundle;  
  12. import android.os.Handler;  
  13. import android.os.Message;  
  14. import android.view.View;  
  15. import android.view.View.OnClickListener;  
  16. import android.widget.Button;  
  17. import android.widget.EditText;  
  18. import android.widget.ImageView;  
  19. import android.widget.Toast;  
  20.   
  21. public class MainActivity extends Activity implements OnClickListener {  
  22.   
  23.     private EditText et_url;  
  24.     private Button btg_go;  
  25.     private ImageView img_urlpic;  
  26.       
  27.     private static final int SUCCESS = 0;  
  28.     private static final int FAIL = 1;  
  29.       
  30.     private Handler handler = new Handler(){  
  31.         /* handleMessage主线程接收子线程发送过来的消息 */  
  32.         @Override  
  33.         public void handleMessage(Message msg) {  
  34.             super.handleMessage(msg);  
  35.               
  36.             switch(msg.what){  
  37.                 case FAIL:  
  38.                     Toast.makeText(MainActivity.this"读取网络图片失败!"0).show();  
  39.                     break;  
  40.                       
  41.                 case SUCCESS:  
  42.                     img_urlpic.setImageBitmap((Bitmap) msg.obj);    //UI主线程里面更新UI信息  
  43.                     break;  
  44.                       
  45.                 default:  
  46.                     break;  
  47.             }  
  48.         }  
  49.     };  
  50.       
  51.     @Override  
  52.     protected void onCreate(Bundle savedInstanceState) {  
  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.     public void onClick(View v) {  
  66.         final String picUrl = et_url.getText().toString();   
  67.           
  68.         /* 子线程里面处理 连接网络抓取图片的功能   */  
  69.         new Thread(new Runnable() {  
  70.             @Override  
  71.             public void run() {  
  72.                 Bitmap netBitmap = getBitmapFromNet(picUrl);  
  73.                 Message msg = new Message();  
  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.     private Bitmap getBitmapFromNet(String urlAddr){  
  87.         Bitmap netBitmap = null;  
  88.         HttpURLConnection httpConn = null;  
  89.           
  90.         try {  
  91.             URL url = new URL(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.                 InputStream is =  httpConn.getInputStream();  
  103.                 netBitmap = BitmapFactory.decodeStream(is);  
  104.             }  
  105.               
  106.         } catch (MalformedURLException e) {  
  107.             e.printStackTrace();  
  108.         } catch (IOException e) {  
  109.             e.printStackTrace();  
  110.         } finally{  
  111.             if(httpConn != null) {  
  112.                 httpConn.disconnect();  
  113.                 httpConn = null;  
  114.             }  
  115.         }  
  116.           
  117.         return netBitmap;  
  118.     }  
  119. }  

        示例效果

        

  Ps:这里读取的是网络图片,所以在AndroidManifest.xml清单文件里面记得添加读取网络的权限 android.permission.INTERNET


http://blog.csdn.NET/yihuiworld 

0 0
原创粉丝点击